регулярное выражение, которое я не понимаю - PullRequest
5 голосов
/ 08 января 2012

Я пытаюсь понять это регулярное выражение, вы можете мне помочь?

(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
  • Я не совсем понимаю значение DOTALL: (?s)
  • почему двойной \\ до }?
  • что именно это означает: (.+?) (мы должны читать это как: ., затем +, действующий на ., затем ?, отвечающий на результат .+?

1 Ответ

8 голосов
/ 08 января 2012

Это регулярное выражение из строки.«Каноническое» регулярное выражение:

(?s)\{\{wotd\|(.+?)\|(.+?)\|([^#\|]+).*?\}\}

Модификатор DOTALL означает, что точка также может соответствовать символу новой строки, но также могут дополняться классами символов, по крайней мере, с Java: т.е. [^a] будет соответствовать каждому икаждый символ, который не является a, включая перевод строки.Некоторые движки регулярных выражений НЕ соответствуют символу новой строки в дополненных классах символов (это можно расценивать как ошибку).

+? и *? - это ленивые квантификаторы (которых обычно следует избегать).Это означает, что им придется смотреть вперед перед каждым символом, который они хотят проглотить, чтобы увидеть, может ли этот символ удовлетворять следующему компоненту регулярного выражения.

Тот факт, что { и } предшествуют \ потому что {...} - это квантификатор повторения {n, m}, где n и m - целые числа.

Также бесполезно выходить из канала | в классе символов [^#\|], это может быть просто записано как [^#|].

И, наконец, .*? в конце, кажется, поглощает остальные поля.Лучшей альтернативой является использование шаблона normal* (special normal*)*, где normal равно [^|}], а special равно \|.

Здесь приведено регулярное выражение без использования ленивых квантификаторов, «фиксированный» класс символови модифицированный конец.Обратите внимание, что модификатор DOTALL также исчез, поскольку точка больше не используется:

\{\{wotd\|([^|]+)\|([^|]+)\|([^#|]+)[^|}]*(?:\|[^|}]*)*\}\}

Шаг за шагом:

\{\{         # literal "{{", followed by
wotd         # literal "wotd", followed by
\|           # literal "|", followed by
([^|]+)      # one or more characters which are not a "|" (captured), followed by
\|           # literal "|", followed by
([^|]+)      # one or more characters which are not a "|" (captured), followed by
\|           # literal "|", followed by
([^#|]+)     # one or more characters which are not "|" or "#", followed by
[^|}]*       # zero or more characters which are not "|" or "}", followed by
(?:          # begin group
  \|         # a literal "|", followed by
  [^|}]*     # zero or more characters which are not "|" or "}"
)            # end group
*            # zero or more times, followed by
\}\}         # literal "}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...