Следующее регулярное выражение находит текст между подстроками FTW и ODP.
/FTW(((?!FTW|ODP).)+)ODP+/
Что делает (?!
... )
?
Следующее регулярное выражение находит текст между подстроками FTW и ODP.
/FTW(((?!FTW|ODP).)+)ODP+/
Что делает (?!
... )
?
(?!regex)
- это отрицательная обратная сторона нулевой ширины. Он будет проверять символы в текущей позиции курсора и вперед, тестируя, что они НЕ соответствуют предоставленному регулярному выражению, а затем возвращают курсор обратно туда, где он был запущен.
Все регулярное выражение:
/
FTW # Match Characters 'FTW'
( # Start Match Group 1
( # Start Match Group 2
(?!FTW|ODP) # Ensure next characters are NOT 'FTW' or 'ODP', without matching
. # Match one character
)+ # End Match Group 2, Match One or More times
) # End Match Group 1
OD # Match characters 'OD'
P+ # Match 'P' One or More times
/
Итак - Охота на FTW
, а затем захватите, ища ODP+
, чтобы закончить нашу строку. Также убедитесь, что данные между FTW
и ODP+
не содержат FTW
или ODP
От perldoc:
A отрицательное прогнозное выражение с нулевой шириной. Например,
/foo(?!bar)/
соответствует любому вхождению "foo
" , за которым не следует "bar
". Обратите внимание, однако, что внешний вид и внешний вид - это не одно и то же. Вы не можете использовать это для поиска.Если вы ищете "бар", которому не предшествует "
foo
" ,/(?!foo)bar/
не будет делать то, что вы хотите. Это потому, что(?!foo)
просто говорит, что следующая вещь не может быть "foo
" - и это не так, это "бар", поэтому "foobar
" будет соответствовать. Для этого вам нужно сделать что-то вроде/(?!foo)...bar/
. Мы говорим "нравится", потому что случай вашего "bar
" не имеет трех символов перед ним. Вы можете это сделать так:/(?:(?!foo)...|^.{0,2})bar/
. Иногда еще проще сказать:
if (/bar/ && $` !~ /foo$/)
Это означает, что "не следует...". Технически это то, что называется негативный взгляд, в котором вы можете заглянуть в то, что впереди в строке, не захватывая его. Это класс утверждения с нулевой шириной, что означает, что такие выражения не фиксируют какую-либо часть выражения.
Программист должен был набирать слишком быстро. Некоторые символы в шаблоне перевернулись. Исправлено:
/WTF(((?!WTF|ODP).)+)ODP+/
Regex
/FTW(((?!FTW|ODP).)+)ODP+/
совпадает с первым FTW, после которого не следует ни FTW, ни ODP, а затем все следующие символы до первого ODP (но если есть FTW где-то в них не будет соответствия), то все буквы P следуют.
Итак, в строке:
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
он будет соответствовать полужирной части
FTWFTWODPFTWjj FTWjjODPPPP jjODPPPjjj
'?! на самом деле является частью '(?!...)', это означает, что все, что внутри, должно НЕ совпадать в этом месте.