Как сопоставить строку, не содержащую слово [дубликат]


этот вопрос уже есть ответ здесь:

мне было интересно, как сопоставить строку, не содержащую определенного слова, используя регулярное выражение в стиле Python (просто используйте регулярное выражение, а не Python функции)?

пример:

PART ONE OVERVIEW 1 
Chapter 1 Introduction 3

Я хочу сопоставить строки, которые не содержат слово "часть"?

спасибо и привет!

1 69

1 ответ:

это должно работать:

/^((?!PART).)*$/

если бы вы только хотели исключить его из начала строки (Я знаю, что вы этого не делаете, но просто FYI), вы могли бы использовать это:

/^(?!PART)/

Edit (по запросу): почему этот шаблон работает

The (?!...) синтаксис-это отрицательный lookahead, что мне всегда было трудно объяснить. В принципе, это означает " все, что следует за этим пунктом, не должно совпадать с регулярным выражением /PART/." сайт Я связал объясняет это гораздо лучше, чем я могу, но я постараюсь сломать это:

^         #Start matching from the beginning of the string.    
(?!PART)  #This position must not be followed by the string "PART".
.         #Matches any character except line breaks (it will include those in single-line mode).
$         #Match all the way until the end of the string.

The ((?!xxx).)* идиома, вероятно, труднее всего понять. Как мы видели, (?!PART) смотрит на строку впереди и говорит, что все, что происходит дальше, не может соответствовать подшаблону /PART/. Так что мы делаем с ((?!xxx).)* проходит через строку букву за буквой и применяет правило ко всем из них. Каждый символ может быть чем угодно, но если вы возьмете этот символ и следующие несколько символов после это, вам лучше не получить слово часть.

The ^ и $ якоря должны требовать, чтобы правило применялось ко всей строке, от начала до конца. Без этих якорей, любой кусок строки, который не начинался с часть будет матч. Даже часть сам по себе будет иметь совпадения в нем, потому что (например) буква A не сопровождается точной строкой часть.

так как мы делаем есть ^ и $, если часть были в любом месте строки, один из символов будет соответствовать (?=PART). и общий матч будет провален. Надеюсь, что это достаточно ясно, чтобы быть полезным.