Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ни дня без регулярки (https://javascript.ru/forum/misc/71287-ni-dnya-bez-regulyarki.html)

Rasy 09.11.2017 15:31

Alexandroppolus,
:thanks:

Lion777 09.11.2017 22:58

подскажите по регулярке или инной выход. Мне нужно разбить строку по нескольким ключевым словам "включить выключить". Например,
есть строка:
"включить воду свет выключить воду выключить свет"
мне надо разбить ее на:

включить воду свет
выключить воду
выключить свет

подскажите варианты

Alexandroppolus 09.11.2017 23:35

var str = "не включать нифига включить воду свет выключить воду выключить свет";
var values = str.match(/(?:включить|выключить)\s(?:.(?!включить|выключить))+/g);
alert(values.join('\n'));

рони 10.11.2017 00:14

var str = "не включать нифига включить воду свет выключить воду выключить свет";
var values = str.match(/(включить|выключить).*?(?=включить|выключить|$)/g);
alert(values.join('\n'));

Lion777 10.11.2017 00:44

пасиб ребята, надо регулярки подтянуть мне, с 2009 года не кодил, все настолько забылось, что просто ужас, счас буду разбиратся в ваших регулярках, что к чему...

Rasy 10.11.2017 15:12

рони,
Правильно ли я сформулировал?

Сопоставить слово "включить или выключить" за которым следует произвольный символ, повторяющийся только, если за ним следует слово "включить или выключить", или конец строки.

Alexandroppolus,
Сопоставить слово "включить или выключить" за которым следует пробел, за пробелом следует произвольный символ повторяющийся один и более раз, если только за ним не следут слово "включить или выключить".

Зачем запрет на использование ссылок в группировке? У меня правильно находит и без символов ?:
/(включить|выключить)\s(.(?!включить|выключить))+/g

Alexandroppolus 10.11.2017 15:35

Цитата:

Сообщение от Rasy
Зачем запрет на использование ссылок в группировке?

запрета, конечно же, нет. Не захватывается группа в матчинге. Незначительная экономия. Просто я привык уже )

Цитата:

Сообщение от Rasy
Правильно ли я сформулировал?

насчет моего правильно, а у рони главная фишка в нежадном *
баз вопросика там съело бы всю строку первым совпадением.

Lion777 10.11.2017 17:12

подскажите, почему данная регулярка не будет работать ?
/(?:включить|выключить).+(?!включить|выключить)/gim

сначала проверяем есть ли включить|выключить потом идет любой символ от 1 и больше раза и не должно быть в конце включить|выключить ?

---
Я вообщем из разбора ваших примеров решил так
/(?:включить|выключить)(?:.(?!включить|выключить))+/gim

так как мне может прилететь строка
"Включить воду свет выключить воду выключить включить свет" и тогда выдаст ["выключить воду", "выключить включить свет"]

Rasy 10.11.2017 17:59

Цитата:

Сообщение от Lion777
подскажите, почему данная регулярка не будет работать ?

Повторение жадное.
Цитата:

Сообщение от Alexandroppolus
баз вопросика там съело бы всю строку первым совпадением.


Lion777 10.11.2017 23:38

Ребята, я еще со своим велосипедом )), сегодня вспоминал регулярки и вот такой вопрос по прежнему вопросу.
Есть строка:

"Включить воду свет выключить воду выключить включить свет"

мне надо что-бы не повторялось подряд выключить включить, а учитывалась последняя подстрока "включить|выключить" с данными, решил вот такой регуляркой

var str = "Включить воду свет выключить воду выключить включить свет" ;
var reg = /(?:включить|выключить)\s(?!включить|выключить).+?(?=\sвключить|\sвыключить|$)/gim;
alert(str.match(reg));



Есть получше вариант ? Или это нормально в плане оптимизаци?


Часовой пояс GMT +3, время: 09:18.