Как я могу написать регулярное выражение, которое не будет совпадать, если строка содержит определенную подстроку? - PullRequest
4 голосов
/ 19 марта 2010

Пример:

Предположим, что в следующем примере я хочу сопоставить строки, которые не содержат слово "NOOOT".
Example A: This shirt is NOOOT black.
Example B: This shirt is black.

Я хочу что-то похожее на класс несовпадающих символов (например, [^ abc]), но для целых строк:
.*?(^NOOOT).*?

Существует ли такое существо?

Ответы [ 3 ]

4 голосов
/ 19 марта 2010

Вы можете сделать это с отрицательным прогнозным утверждением (?!…):

^(?:(?!NOOOT).)*$

Этот вариант соответствует только в том случае, если на текущей позиции впереди NOOOT нет, пока идет символ за символом.

Это также возможно сделать с помощью основного синтаксиса. Но это сложнее.

4 голосов
/ 19 марта 2010
^(?:(?!NOOOT).)*$

Пояснение:

^ начало строки

(?!NOOOT). утверждает, что невозможно сопоставить NOOOT в текущей позиции, а затем сопоставить любой символ.

(?: ...)* делать это любое количество раз, пока ...

$ конец строки.

2 голосов
/ 19 марта 2010

Дополнение регулярными выражениями - плохая идея. Это возможно, но действительно плохой стиль, и может быть неэффективным; и негативные утверждения, которые позволяют вам сделать это кратко, могут только скрыть неэффективность. Почти всегда лучшая идея состоит в том, чтобы обычно соответствовать регулярному выражению и инвертировать результат с !.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...