【发布时间】:2016-05-16 21:21:15
【问题描述】:
我开发了一个正则表达式来识别文本文件中的一个 xml 块。表达式看起来像这样(我已删除所有 java 转义斜杠以使其易于阅读):
<\?xml\s+version="[\d\.]+"\s*\?>\s*<\s*rdf:RDF[^>]*>[\s\S]*?<\s*\/\s*rdf:RDF\s*>
然后我对其进行了优化并将[\s\S]*?替换为.*?它突然停止识别xml。
据我所知,\s 表示所有空白符号,\S 表示所有非空白符号或[^\s] 所以[\s\S] 在逻辑上应该等同于. 我没有使用贪心过滤器,那有什么区别呢?
【问题讨论】:
-
默认情况下
.不匹配行分隔符。如果您使用Patter.DOTALL标志,它可能匹配所有字符(包括行分隔符)。[\s\S]设置为包括所有空格 \s 和所有非空格 \S,有效地表示所有字符(包括行分隔符)。 -
尾随 ?在这两种情况下都没有任何贡献。
-
好问题,我真的很惊讶它没有更多的赞成票。