Вход | Регистрация



Задача на REGEX (JavaScript)

Задача на REGEX (JavaScript)
Я
   Доктор Манхэттен
 
06.09.18 - 15:22
Кто силен в regex? Нужно в многострочной строке найти подстроку по такому условию:

"строка1", "любые символы включая перенос строки, кроме строка1 и кроме строка2", "строка2"
 
 
   Вафель
 
1 - 06.09.18 - 15:23
строка1*строка2
не жадный вариант (а он по умолчанию) не будет содержать внутри строка1
   Fragster
 
2 - 06.09.18 - 15:32
(1) по умолчанию как раз жадный
   Fragster
 
3 - 06.09.18 - 15:33
да и вообще в (1) "0 или более повторений единицы" в середине
   1000110111100101
 
4 - 06.09.18 - 15:33
строка1.+?строка2
   Вафель
 
5 - 06.09.18 - 15:34
нет чтот я наврал
   Очевидно
 
6 - 06.09.18 - 15:36
grep 'строка1.*строка2'
   Вафель
 
7 - 06.09.18 - 15:43
Вот такой вариант, но он не учитывает наличие строки1 внтури
(?<=строка1)(.|\n)*(?=строка2)

для теста
https://regex101.com
   Доктор Манхэттен
 
8 - 06.09.18 - 15:45
(7) А надо учитывать наличие строки1 внтури
   Fragster
 
9 - 06.09.18 - 15:49
ИМХО задача на регэкспах не совсем решаема, проще свою стейт машину написать с поиском строк. Ну, или через последовательное деление по "Строка2", а затем кусков по "Строка1"
   Fragster
 
10 - 06.09.18 - 15:51
проблема в том, что условия исключения более одного символа в длину и "любой символ" скушает сначала кусок от строки исключения, а потом остаток также не будет строкой искючения.
 
 Рекламное место пустует
   Доктор Манхэттен
 
11 - 06.09.18 - 16:06
(9) +1
Мне тоже сначала показалось что задача нерешаемая.
   Вафель
 
12 - 06.09.18 - 16:07
тут нужно через рекурсивные делать
   Вафель
 
13 - 06.09.18 - 16:08
   Доктор Манхэттен
 
14 - 06.09.18 - 16:34
(13) для PHP не пойдет, нужно именно для JavaScript
   Вафель
 
15 - 06.09.18 - 16:45
Вот такая борется с 1 вложенной строкой
   Вафель
 
16 - 06.09.18 - 16:45
   Fragster
 
17 - 06.09.18 - 16:49
(16) строка1 плваопо строка2валпваоп строка1 ьопау лдпаа строка2
   Вафель
 
18 - 06.09.18 - 16:52
для однострочки такой пойдет
(?'start'строка1).*(?&start)(?'res'.*)(?=строка2)
https://regex101.com/r/bcoUwM/3
   Вафель
 
19 - 06.09.18 - 16:52
в группе res будет лежать минимальная строка
   Вафель
 
20 - 06.09.18 - 16:55
итоговый вариант с учетом переносов строк
(?'start'строка1)(.|\n)*(?&start)(?'res'(.|\n)*)(строка2)
   Fragster
 
21 - 06.09.18 - 16:58
(20) строка1 плваопо валпваоп строка1 sdf строка2 ьопау лc строка1 дпаа строка2
   Вафель
 
22 - 06.09.18 - 16:59
ну да, когда в тексте несколько ответов, то найдет только последний
   Fragster
 
23 - 06.09.18 - 17:13
(22) строка1 плваопо валпваоп строка1 ьопау лc строка1 дпаа строка2 дпаа строка2
   Доктор Манхэттен
 
24 - 06.09.18 - 17:23
(20) Переносы строк могут быть и в Windows формате. Вместо (.|\n) в жаваскрипте можно делать [^]
   Вафель
 
25 - 06.09.18 - 17:29
вот еще вариант
(?<=s1)((?!s1|s2)(.|\n))*(?=s2)
   Доктор Манхэттен
 
26 - 06.09.18 - 17:29
(20) и PHP шаблоны не подходят, нужно решаить только на JS
   Fragster
 
27 - 06.09.18 - 17:32
(25) этот хороший. остались проблемы с переносом строк и тем, что у автора непонятно что (подозреваю, что даже на javascript, а встроенный в виндовс кастрат)
   Доктор Манхэттен
 
28 - 06.09.18 - 17:33
(25) Вроде хороший вариант.
Как тебе такое, Fragster?
   Вафель
 
29 - 06.09.18 - 17:33
(27) переносы вроде отрабатывает
   Вафель
 
30 - 06.09.18 - 17:34
можно без look ahead, но тогда s1 и s2 будут внтри найленной строки
   Доктор Манхэттен
 
31 - 06.09.18 - 17:34
(27) Что не так с переносами и javascript?
   Доктор Манхэттен
 
32 - 06.09.18 - 17:34
(30) На это пофиг, пусть будут
   Вафель
 
33 - 06.09.18 - 17:35
(s1)(((?!s1|s2)(.|\n))*)(s2)
 
 
   Fragster
 
34 - 06.09.18 - 17:35
(28) >(подозреваю, что даже на javascript, а встроенный в виндовс кастрат)
   Доктор Манхэттен
 
35 - 06.09.18 - 17:36
(34) Регулярка то чем плоха? У тебя не работает или что?
   Fragster
 
36 - 06.09.18 - 17:37
(35) я же сказал, что она норм, за исключением переносов и того, что у тебя может быть не тот javascript, что на сайте
   Доктор Манхэттен
 
37 - 06.09.18 - 17:38
(36) Что не так с переносами? И если у меня не тот JS что на сайте, что это меняет?
   Вафель
 
38 - 06.09.18 - 17:38
чтоб учесть все виды переносов
.|\n|\n\r
   Вафель
 
39 - 06.09.18 - 17:38
или \r\n уже не помню
   Доктор Манхэттен
 
40 - 06.09.18 - 17:39
(38) Про переносы я уже писал выше (24)
Не запаривайся, там все норм
   Вафель
 
41 - 06.09.18 - 17:41
(40) на сайте такой вариант не отрабатывает
   Fragster
 
42 - 06.09.18 - 17:41
(37)
>Что не так с переносами?
разные движки по разному обрабатывают переносы
>И если у меня не тот JS что на сайте, что это меняет?
если у тебя vbscript.regex (или jscript.regex), то там ЕМНИП всякие negative lookahead/behind плохо работают
(38)(39) забей, и без этого норм, . поглощает \n
   Доктор Манхэттен
 
43 - 06.09.18 - 17:42
(41) Переключи с PHP на жаваскрипт, и будет отрабатывать
   Fragster
 
44 - 06.09.18 - 17:42
   Вафель
 
45 - 06.09.18 - 17:45
ах вот ты что про пернос троки имел ввиду
   Вафель
 
46 - 06.09.18 - 17:46
Хорошая задачка была.
   Доктор Манхэттен
 
47 - 06.09.18 - 17:48
(46) Рад был помочь
   Доктор Манхэттен
 
48 - 06.09.18 - 17:49
Надо на мисте сделать рейтинг чуваков которые в чем-то шарат.
Там будут как минимум уже двое: jsmith82 и Вафель
   Fragster
 
49 - 06.09.18 - 17:50
(48) рейтинг мудаков будет полезнее
 
 Рекламное место пустует
   Fragster
 
50 - 06.09.18 - 17:51
по этому никакого рейтинга не будет, ставь себе сам галочки
   Доктор Манхэттен
 
51 - 06.09.18 - 17:51
(49) Не думаю. Можно просто открыть список всех пользователей
   Доктор Манхэттен
 
52 - 06.09.18 - 17:56
(50) Ага, поставил
   Доктор Манхэттен
 
53 - 06.09.18 - 19:21
(33) Немного убрал лишние группы и упростил:
(?:s1)((?!s1)[^])*?(?:s2)
   Сияющий в темноте
 
54 - 07.09.18 - 09:20
В javascript есть замечательный indexOf,позволяющий искать с указанного места,просто ищем строку 1,а потом от нее же строку 1 и строку2,если 1 нашлась раньше,то переходим на нее,если нашлась вторая,то вот он наш кусок.
и,есть подозрение,что работать будет быстрее,чем RegExp
   Доктор Манхэттен
 
55 - 07.09.18 - 19:21
(54) В этом никто не сомневается, и к условию задачи это не имеет отношения. В заголовке темы же написано: "Задача на REGEX"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует