2015-09-03 3 views
1

Я знаю три вещи ...Как инвертировать строку в регулярном выражении

1) Я знаю, что:

a.{1,250}?z 

будет проверить, что находится в пределах 250 символов г.

2) Я знаю, что

a[^b]{1,250}?z 

будет проверить, что находится в пределах 250 символов г, но ни один из этих символов не б.

3) Я знаю, что

a[^bad]{1,250}?z 

будет проверить, что находится в пределах 250 символов г, но ни один из этих символов не Ь, а, или d.

но

4)

Как ничего себе я бы проверить, что происходит в пределах 250 символов г, но это слово плохое не появляется между ними?

Воображая «строка» требуется точное совпадение (например, в поиске Google) псевдо-код будет выглядеть следующим образом:

a[^"bad"]{1,250}?z 

ответ

3

Простой, используйте ngeative предпросмотр.

a(?:(?!bad).){1,250}?z 

(?:(?!bad).) будет соответствовать любому символу (за исключением разрывов строк), но не подстроки bad.

DEMO

А также вы должны использовать анкеры или границу слов в заказе, чтобы сделать точное совпадение или иначе, выше регулярное выражение будет соответствовать adccz для этого acbadccz ввода.

\ba(?:(?!bad).){1,250}?z\b 
+0

Это идеальный вариант. – COMisHARD

+0

Не точно * regular * (lookaheads - это расширение), но я не уверен, что это может быть технически решено с помощью чистых регулярных выражений ... Итак, вы получаете +1 от меня :) – Sebivor

+0

@Seb, отрицательный взгляд может быть полностью решен с обычным регулярным выражением, но в общем случае регулярное выражение, которое соответствует точному набору строк, намного сложнее исходного. В этом причина расширения. Легко продемонстрировать с помощью конечных автоматов, но вне времени и пространства здесь. –

Смежные вопросы