我想了解这个正则表达式,你能帮助我吗?
(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
Run Code Online (Sandbox Code Playgroud)
(?s) \\前}? (.+?)我们应该这样读:这样.,然后+采取行动.,然后?回应结果.+?这个正则表达式来自一个字符串."规范"正则表达式是:
(?s)\{\{wotd\|(.+?)\|(.+?)\|([^#\|]+).*?\}\}
Run Code Online (Sandbox Code Playgroud)
DOTALL修饰符意味着点也可以匹配换行符,但是也可以补充字符类,至少使用Java:即[^a]匹配每个不a包含换行符的字符.一些正则表达式引擎不匹配补充字符类中的换行符(这可以被视为一个错误).
的+?和*?懒惰量词(一般应避免其中).这意味着他们必须在他们想要吞下的每个角色之前向前看,看看这个角色是否能够满足正则表达式的下一个组成部分.
之前{和}之前的事实\是因为{...}是重复量词{n,m},其中n和m是整数.
另外,|在字符类中转义管道是没用的[^#\|],它可以简单地写成[^#|].
最后,.*?最后似乎吞下了剩下的田地.更好的选择是使用normal* (special normal*)*模式,其中normal是[^|}]和special是\|.
这是正则表达式,不使用惰性量词,"固定"字符类和修改后的结尾.请注意,DOTALL修改器也已消失,因为不再使用点:
\{\{wotd\|([^|]+)\|([^|]+)\|([^#|]+)[^|}]*(?:\|[^|}]*)*\}\}
Run Code Online (Sandbox Code Playgroud)
一步步:
\{\{ # 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 "}}"
Run Code Online (Sandbox Code Playgroud)