Мне нравится читать блог Сотрудника Google Steve Yegge, и недавно я столкнулся эта статья его , где он утверждает, что Mozilla Rhino является хорошим решением для серверной стороны JS. Это - несколько неаккуратная расшифровка стенограммы, Вы могли бы предпочесть смотреть видео разговора . Это также предлагает определенное понимание на том, почему он думает серверная сторона, JS является хорошей идеей во-первых (или скорее почему он думает, что это - хорошая идея использовать динамический язык для сценариев Java). Я думал точки, которые он делает, были убедительны, таким образом, Вы могли бы хотеть проверить его.
Некоторое время ранее, он также отправил что-то о динамических языках в общем (он - большой поклонник их), на всякий случай Вы задавались вопросом, почему использовать JS вообще.
(?! 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
Из 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+/
Это означает "без ...". Технически это то, что называется отрицательным взглядом вперед , поскольку вы можете заглядывать в то, что впереди в строке, не фиксируя это. Это класс утверждений нулевой ширины, что означает, что такие выражения не захватывают никакую часть выражения.
'?!' на самом деле является частью '(?! ...)', это означает, что все, что находится внутри, НЕ должно совпадать в этом месте.
Регулярное выражение
/FTW(((?!FTW|ODP).)+)ODP+/
соответствует первому FTW, сразу за которым не следует ни FTW, ни ODP, затем все следующие символы до первого ODP (но если где-то в них есть FTW, совпадения не будет) затем все следующие буквы P.
Итак, в строке:
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
она будет соответствовать полужирной части
FTWFTWODPFTWjj FTWjjODPPPP [114350032] jjOD