шаблон регулярных выражений, НЕ содержащий строку - PullRequest
3 голосов
/ 25 февраля 2010

Это уже спрашивалось здесь , но спрашивающий был удовлетворен ответом на поиск двух символов. Я повторяю его основной вопрос:

Вообще, есть ли способ, как скажем, не содержит строку в том же То, что я могу сказать, не содержит персонаж с [^ a]?

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

Пример:

Строки: "<script>" и "</script>"

Это должно соответствовать

"<script> something something </script>"

но не

"<script> something <script> something something </script>"

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Вы читали мой ответ на этот вопрос? Это дает более общее решение. В вашем случае это будет выглядеть так:

(?s)<script>(?:(?!</?script>).)*</script>

Другими словами: соответствует последовательности открытия; затем сопоставляйте по одному символу за раз, после , гарантируя, что это не начало закрывающей последовательности; затем сопоставьте последовательность закрытия.

1 голос
/ 25 февраля 2010

Использовать отрицательный взгляд . Lookarounds дают совпадения нулевой ширины - это означает, что они не потребляют никаких символов в исходной строке.

var s1 = "some long string with the CENSORED word";
var s2 = "some long string without that word";
console.log(s1.match(/^(?!.*CENSORED).*$/));//no match
console.log(s2.match(/^(?!.*CENSORED).*$/));//matches the whole string

Синтаксис для негативного прогноза (?!REGEX). Он ищет REGEX и возвращает false, если совпадение найдено. Положительный прогноз (?=REGEX) возвращает true, если совпадение найдено.

1 голос
/ 25 февраля 2010

Правильное выражение для вашей проблемы:

"^<script>((?!<script>).)*</script>$"

Этот не должен использоваться для манипулирования html. Это не относится к таким случаям, как

<script> foo <script type="javascript"> bar </script>

и многие другие. Парсер - правильное решение здесь.

Более общее выражение для соответствующих строк, начинающихся с START и заканчивающихся END без определенной последовательности символов foobar между ними:

"^START((?!foobar).)*END$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...