Регулярное выражение, которое не содержит определенную строку [дубликат]

Нашел ответ очень быстро после публикации вопросов. Тем не менее, следовал инструкции, которая гласила, что @login_required для использования. Тем не менее, правильный декортатор, который будет использоваться:

@protected_resource()
76
задан finnw 26 August 2009 в 10:25
поделиться

4 ответа

В целом это - боль для записи регулярного выражения, не содержащего конкретную строку. Мы должны были сделать это для моделей вычисления - Вы берете NFA, который достаточно легко определить и затем уменьшить его до регулярного выражения. Выражение для вещей, не содержащих "кошку", было приблизительно 80 символами долго.

Править: Я только что закончил и да, это:

aa([^a] | a[^a])aa

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

18
ответ дан Claudiu 24 November 2019 в 11:04
поделиться

Все, в чем Вы нуждаетесь, является неохотным квантором:

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

Вы могли использовать отрицательное предвидение также, но в этом случае это - просто более подробный путь, выполняют то же самое. Кроме того, это немного более хитро, чем gpojd разобрал его, чтобы быть. Предвидение должно быть применено в каждом положении, прежде чем точке позволят использовать следующий символ.

/aa(?:(?!aa).)*aa/

Что касается подхода, предложенного Claudiu и finnw, это будет работать хорошо, когда строка сигнальной метки будет только двумя символами долго, но (как подтвержденный Claudiu) это является слишком громоздким для более длинных строк.

10
ответ дан Alan Moore 24 November 2019 в 11:04
поделиться
/aa([^a]|a[^a])*aa/
7
ответ дан finnw 24 November 2019 в 11:04
поделиться

Силой Google я нашел пост в блоге от 2007 года, который дает следующий regex, который соответствует строке, которая не содержит определенную подстроку:

^((?!my string).)*$

Он работает следующим образом: он ищет ноль или более (*) символов (.), которые не начинаются (?! - отрицательный заголовок) вашей строки, и он устанавливает, что вся строка должна состоять из таких символов (с помощью якорей ^ и $). Или по-другому:

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

204
ответ дан 24 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: