Ответ 1
Это должно работать:
/^((?!PART).)*$/
Если вы только хотели исключить его из начала строки (я знаю, что вы этого не делаете, но просто FYI), вы можете использовать это:
/^(?!PART)/
Изменить (по запросу): Почему этот шаблон работает
Синтаксис (?!...)
- это негативный взгляд, который мне всегда трудно объяснить. В основном это означает, что "все, что следует за этой точкой, не должно соответствовать регулярному выражению /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.
Идиома ((?!xxx).)*
, вероятно, труднее всего понять. Как мы видели, (?!PART)
смотрит на строку вперед и говорит, что все, что приходит дальше, не может соответствовать подшаблону /PART/
. Итак, то, что мы делаем с ((?!xxx).)*
, проходит через буквенную букву и применяет правило ко всем из них. Каждый символ может быть любым, но если вы возьмете этот символ и следующие несколько символов после него, вам лучше не получить слово PART.
Якоря ^
и $
должны требовать, чтобы правило применялось ко всей строке, от начала до конца. Без этих якорей любая часть строки, которая не начиналась с PART, была бы совпадением. Даже сам PART будет иметь в себе совпадения, потому что (например) буква A не сопровождается точной строкой PART.
Так как у нас есть ^
и $
, если PART находится где угодно в строке, один из символов будет соответствовать (?=PART).
, и общее совпадение не будет выполнено. Надеюсь, что это достаточно ясно, чтобы быть полезным.