Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение, помогите плиз (https://javascript.ru/forum/misc/62525-regulyarnoe-vyrazhenie-pomogite-pliz.html)

Frozen Coyote 15.04.2016 00:13

Регулярное выражение, помогите плиз
 
Приветсвую, господа,

прошу помощи: необходимо составить регулярное выражение, которое ловит диапазон <p></p> но при условии, если в этом диапазоне (читай в параграфе) отсуствует какое то определенное слово (или иная последовательность символов), ну допустим "петя". Понимаю что надо как то использовать негативное загляядывание вперед, но не соображу как, не получается... что то типа /<p.+?<\/p(?!Петя)/gi


спасибо

Alexander Belov 15.04.2016 00:23

Frozen Coyote,
var p = "Sarah Connor";

p.indexOf("John") >= 0 ? alert("John found!") : alert ("No John");


с RegEx

var word = /John/,
    p = "Sarah Connor";

word.test(p) ? alert ("John found!") : alert ("No John");

Frozen Coyote 15.04.2016 00:46

наверно я неправильно объяснил, но суть Вашего ответа не совсем уловил. Пример с параграфами для простоты оформил. Есть несколько совпадений по регулярному выражению, Результат1, Результат2, Результат3, например /<\/p>(.+?)<\/p>/gi должен вернуть </p>Результат1</p>, </p>Еще какой то результат</p> и </p>Третий результат</p>, мне нужно задать исключение чтобы к примеру результат содержащий слово "какой то" исключался

Alexander Belov 15.04.2016 08:26

Frozen Coyote,
Напишите пример обычным предложением, не уверен, что понимаю.
Напр.:
Строка: "Светлый майский день" при совпадении с /день/ должна возвращать то-то, при не совпадении то-то...

Frozen Coyote 15.04.2016 09:07

паттерн /светлый.+?день/ возвращает светлый майский день, светлый июньский день, светлый ноябрьский день. Хотелось бы чтобы при наличии слова "июньский" внутри совпадения, данный результат игнорировался.

спасибо большое

рони 15.04.2016 10:11

stupidpendos,
<p>peter bar</p>
а так?

Alexander Belov 15.04.2016 10:28

Frozen Coyote,
var apr = "It's a dark april night",
    may = "It's a bright may day",
    jun = "It's a bright june day",
    jul = "It's a bright july day";

var pattern = (".* bright(?!june).* day.*");

apr.match(pattern) ? alert("Gotcha!") : alert("Sorry");
may.match(pattern) ? alert("Gotcha!") : alert("Sorry");
jun.match(pattern) ? alert("Gotcha!") : alert("Sorry");
jul.match(pattern) ? alert("Gotcha!") : alert("Sorry");


Я правильно понял? Аналогичный результат нужен?

stupidpendos 15.04.2016 10:40

Цитата:

Сообщение от рони (Сообщение 414164)
stupidpendos,
<p>peter bar</p>
а так?

да, местами, по ходу поменять надо
<html>
<head> </head>
<body>

<div id = "container">
 <p>foo bar</p>
 <div>foo bar</div>
 <p>foo bar</p>
 <div>foo bar</div>
 <p>foo peter bar</p>
 <p>peter bar</p>
 <p>foo bar</p>
 <div>foo bar</div>
 <p>foo sam bar</p>
 <p>foo bar</p>
</div>


 <script>



   re = /<p>(((?!peter)[\s\S])*?)<\/p>/g

  console.log(
   container.innerHTML.match(re).join("\n")
   )



 </script>
</body>

Frozen Coyote 15.04.2016 12:21

Alexander Belov, спасибо, все правильно получилось, ребята, всем спасибо за содействие.

еще вопрос крохотный, подскажите пожалуйста. у меня есть строка допустим "бахбахбах", если задать паттерн "бахбах" - регулярка находит только одно совпадение, проскакивая дальше, а в строке как мы видим - две комбинации. как заставить выражение выцепить оба?

stupidpendos 15.04.2016 12:28

Frozen Coyote,
так не делается. Регулярки однопроходные по-определению, иначе бы они тормозили. Решайте задачу по другому

рони 15.04.2016 12:37

Цитата:

Сообщение от Frozen Coyote
как заставить выражение выцепить оба?

и что потом?

stupidpendos 15.04.2016 12:38

Frozen Coyote,
Кстати, он Вам неверный код дал. там у него во первых поиск жадный, он будет жрать все подряд идущие параграфы как один, а во вторых, он будет на переносах строк спотыкаться, и еще там есть подводные камни.

Frozen Coyote 15.04.2016 13:10

да, Вы правы, буду по другому. Тогда последний вопрос по моей задачке:

почему выражение /<\/p>(.+?)?<\/p>/gi в строке </p></p></p>123</p> ловит расширенное </p></p></p> но не ловит первое совпадение <\/p><\/p> - жадность как бы выключена, да и я указал знаком вопроса после скобочного участка, что группа как может присутвовать так и отсутствовать. В чем ошибка моя?

stupidpendos 15.04.2016 14:51

Цитата:

Сообщение от Frozen Coyote (Сообщение 414195)
да, Вы правы, буду по другому. Тогда последний вопрос по моей задачке:

почему выражение /<\/p>(.+?)?<\/p>/gi в строке </p></p></p>123</p> ловит расширенное </p></p></p> но не ловит первое совпадение <\/p><\/p> - жадность как бы выключена, да и я указал знаком вопроса после скобочного участка, что группа как может присутвовать так и отсутствовать. В чем ошибка моя?

на вскидку, потому, что + означает хотя бы один символ. Попробуйте звезду вместо него. Тестить неохота

Frozen Coyote 15.04.2016 14:58

и правильно, что неохота. ибо не работает.

stupidpendos 15.04.2016 15:06

Цитата:

Сообщение от Frozen Coyote (Сообщение 414209)
и правильно, что неохота. ибо не работает.

у меня работает
alert("</p></p></p>".match(/<\/p>.*?<\/p>/)[0])

Alexander Belov 15.04.2016 16:03

Frozen Coyote,
Да, увидел, что не правильно сделал в предыдущем варианте. Сам параллельно с Вами разбираюсь.
var apr = "It's a dark april night",
    may = "It's a bright may day",
    jun = "It's a bright june day",
    jul = "It's a bright july day";
 
var pattern = /bright(:?(?!june).)*day/;
 
alert(apr.match(pattern));
alert(may.match(pattern));
alert(jun.match(pattern));
alert(jul.match(pattern));

Frozen Coyote 15.04.2016 23:24

Александр, вот у человека вышеозначенный пример работает

alert("</p></p></p>".match(/<\/p>.*?<\/p>/)[0])

я что то не пойму, как может ловиться совпадение <\/p><\/p> ведь между этими закрывающимися тегами стоит .*? что означает как я понимаю как минимум наличие одного символа? или я неправ?

спасибо Вам за помощь :)

Alexander Belov 16.04.2016 00:35

Frozen Coyote,
. -один любой символ, кроме новой строки
* - совпадение выражения 0 или более раз
? - совпадение выражения 0 или 1 раз

Ссылка

Т.е. может и не быть символа вообще. Не понятно, зачем проверять на 0 или более (*), а потом на 0 или 1 совпадение(?).

Frozen Coyote 19.04.2016 15:22

ребята всем спасибо

orionpro 20.04.2016 18:08

Цитата:

Сообщение от Frozen Coyote (Сообщение 414248)
Александр, вот у человека вышеозначенный пример работает

alert("</p></p></p>".match(/<\/p>.*?<\/p>/)[0])

Только, как я понял, там должно быть
alert("<p></p></p>".match(/<\p>.*?<\/p>/)[0])

Ведь мы ищем в теге <p>. А не в закрывающихся тегах </p>.
Или надо чтобы он ловил весь тег и с тем что внутри, типа такого?
alert("<a>что угодно внутри</a>".match(/<\a>.*?<\/a>/)[0])


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