Regex: что делает (?! …) средний?

Мне нравится читать блог Сотрудника Google Steve Yegge, и недавно я столкнулся эта статья его , где он утверждает, что Mozilla Rhino является хорошим решением для серверной стороны JS. Это - несколько неаккуратная расшифровка стенограммы, Вы могли бы предпочесть смотреть видео разговора . Это также предлагает определенное понимание на том, почему он думает серверная сторона, JS является хорошей идеей во-первых (или скорее почему он думает, что это - хорошая идея использовать динамический язык для сценариев Java). Я думал точки, которые он делает, были убедительны, таким образом, Вы могли бы хотеть проверить его.

Некоторое время ранее, он также отправил что-то о динамических языках в общем (он - большой поклонник их), на всякий случай Вы задавались вопросом, почему использовать JS вообще.

16
задан Alan Moore 3 September 2009 в 03:39
поделиться

6 ответов

(?! 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 + не соответствуют t содержат FTW или ODP

29
ответ дан 30 November 2019 в 15:21
поделиться

Из perldoc :

A утверждение отрицательного упреждающего просмотра нулевой ширины . Например, / foo (?! Bar) / соответствует любому вхождению « foo », за которым не следует « bar ». Однако обратите внимание, что предварительный просмотр и предварительный просмотр - НЕ одно и то же. Вы не можете использовать это для просмотра назад.

Если вы ищете «полосу», которой не предшествует « foo », / (?! foo) bar / не будет делать то, что вы хотите. Это потому, что (?! foo) просто говорит, что следующее не может быть « foo » - и это не так, это «бар», поэтому « foobar "будет соответствовать. Для этого вам нужно будет сделать что-то вроде / (?! foo) ... bar / . Мы говорим «нравится», потому что в вашем « bar » нет трех символов перед ним. Вы можете объяснить это следующим образом: / (? :( ?! foo) ... | ^. {0,2}) bar / . Иногда все же проще сказать:

if (/bar/ && $` !~ /foo$/)
19
ответ дан 30 November 2019 в 15:21
поделиться

Программист, должно быть, набирал слишком быстро. Некоторые символы в шаблоне были перевернуты. Исправлено:

/WTF(((?!WTF|ODP).)+)ODP+/
2
ответ дан 30 November 2019 в 15:21
поделиться

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

7
ответ дан 30 November 2019 в 15:21
поделиться

'?!' на самом деле является частью '(?! ...)', это означает, что все, что находится внутри, НЕ должно совпадать в этом месте.

0
ответ дан 30 November 2019 в 15:21
поделиться

Регулярное выражение

/FTW(((?!FTW|ODP).)+)ODP+/

соответствует первому FTW, сразу за которым не следует ни FTW, ни ODP, затем все следующие символы до первого ODP (но если где-то в них есть FTW, совпадения не будет) затем все следующие буквы P.

Итак, в строке:

FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj

она будет соответствовать полужирной части

FTWFTWODPFTWjj FTWjjODPPPP [114350032] jjOD

2
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: