Это регулярное выражение из строки.«Каноническое» регулярное выражение:
(?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 "}}"