Имя: Пароль:
IT
Веб-мастеринг
Задача на REGEX (JavaScript)
, ,
0 Доктор Манхэттен
 
06.09.18
15:22
Кто силен в regex? Нужно в многострочной строке найти подстроку по такому условию:

"строка1", "любые символы включая перенос строки, кроме строка1 и кроме строка2", "строка2"
1 Вафель
 
06.09.18
15:23
строка1*строка2
не жадный вариант (а он по умолчанию) не будет содержать внутри строка1
2 Fragster
 
гуру
06.09.18
15:32
(1) по умолчанию как раз жадный
3 Fragster
 
гуру
06.09.18
15:33
да и вообще в (1) "0 или более повторений единицы" в середине
4 1000110111100101
 
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 внтури
9 Fragster
 
гуру
06.09.18
15:49
ИМХО задача на регэкспах не совсем решаема, проще свою стейт машину написать с поиском строк. Ну, или через последовательное деление по "Строка2", а затем кусков по "Строка1"
10 Fragster
 
гуру
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
17 Fragster
 
гуру
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)
21 Fragster
 
гуру
06.09.18
16:58
(20) строка1 плваопо валпваоп строка1 sdf строка2 ьопау лc строка1 дпаа строка2
22 Вафель
 
06.09.18
16:59
ну да, когда в тексте несколько ответов, то найдет только последний
23 Fragster
 
гуру
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
27 Fragster
 
гуру
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)
34 Fragster
 
гуру
06.09.18
17:35
(28) >(подозреваю, что даже на javascript, а встроенный в виндовс кастрат)
35 Доктор Манхэттен
 
06.09.18
17:36
(34) Регулярка то чем плоха? У тебя не работает или что?
36 Fragster
 
гуру
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) на сайте такой вариант не отрабатывает
42 Fragster
 
гуру
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 на жаваскрипт, и будет отрабатывать
44 Fragster
 
гуру
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 и Вафель
49 Fragster
 
гуру
06.09.18
17:50
(48) рейтинг мудаков будет полезнее
50 Fragster
 
гуру
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"