我想了解这个正则表达式,你能帮我吗?正则表达式,我不明白
(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
- 我真的不明白DOTALL的含义:
(?s)
- 为什么双
\\
前}
? - 是什么恰恰意味着:
(.+?)
(我们应该阅读这样的:作用于.
的.
,然后+
,然后?
响应的.+
我想了解这个正则表达式,你能帮我吗?正则表达式,我不明白
(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
(?s)
\\
前}
?(.+?)
(我们应该阅读这样的:作用于.
的.
,然后+
,然后?
响应的.+
这正则表达式是一个字符串的结果? “规范”正则表达式是:
(?s)\{\{wotd\|(.+?)\|(.+?)\|([^#\|]+).*?\}\}
的DOTALL修饰符意味着该点也可以匹配换行符,但所以补充字符类,至少与Java:即[^a]
会匹配每个不是a
的字符,包括换行符。一些正则表达式引擎在补充字符类中不匹配换行符(这可以被看作是一个bug)。
+?
和*?
是惰性量词(通常应该避免)。这意味着他们必须在他们想要吞下的每个角色之前向前看,看看这个角色是否能够满足正则表达式的下一个组成部分。
{
和}
之前是\
这一事实是因为{...}是重复量词{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 "}}"
为什么建议避免懒惰的量词? – Lucero 2012-01-08 15:20:53
应该指出,你的正则表达式不等于原来的;原件将匹配你不会的许多字符串。如果我不得不猜测,我会猜测你的版本更接近正则表达式编写者的原意,但不知道需求是什么,没有办法知道确切的。 (顺便说一句,你可以从你的版本中删除'(?s)',因为你的版本不会使用'.' – ruakh 2012-01-08 15:22:51
没有最后的'。*?'有意义,因为其他管道也逃脱(你最终的正则表达式下降)。正则表达式正在寻找一个字符串,其中管道用作各种字段的分隔符:'{wotd | field1 | field2 | some_stuff#可能是一个评论?]' – user268396 2012-01-08 15:23:24
在你看到这个源,它是在一个字符串?例如,它真的是'Pattern p = Pattern.compile(“(?s)\\ {\\ {wotd \\ |(。+?)\\ |(。+?)\\ |([^#\\ |] +)* \\} \\}“);'?它很重要,因为反斜杠在字符串文字和正则表达式中都是逃逸的,所以为了解释'\\ {'我们需要知道是否是''\\ {“'(在这种情况下'\\'模式编译器作为一个单一的反斜杠,它转义下面的''''或它的'\\ {'(例如,从文本文件或其他东西读取),在这种情况下,模式编译器会看到一个* escapeped * {'。 – 2012-01-08 15:09:28
'。+?'是一个非贪婪(“不情愿”)'+'操作符。 '\\\'表示一个文字反斜杠,假设正则表达式是Java并嵌入到Java字符串中,则第一个'\\'会转义第二个。 – 2012-01-08 15:10:09