是什么区别[\ s\S]*?和.*?在Java正则表达式?

Dmi*_*try 9 java regex xml

我已经开发了一个正则表达式来识别文本文件中的xml块.表达式看起来像这样(我删除了所有java转义斜杠以使其易于阅读):

<\?xml\s+version="[\d\.]+"\s*\?>\s*<\s*rdf:RDF[^>]*>[\s\S]*?<\s*\/\s*rdf:RDF\s*>
Run Code Online (Sandbox Code Playgroud)

然后我优化它并替换[\s\S]*?.*?It突然停止识别xml.

据我所知,\s意味着所有的空格符号,\S意味着所有的非白色间隔符号或[^\s]因此[\s\S]逻辑上应该相当于.我没有用贪婪的过滤器,所以可能是什么区别?

Neu*_*ron 13

正则表达式.\s\S不等价的,因为.默认情况下不追上线终止(如新行).

根据oracle网站,.比赛

任何字符(可能与行终止符匹配也可能不匹配)

行终止符是以下任何一种:

  • 换行符(换行符)('\n'),
  • 一个回车符后面跟一个换行符("\r\n"),
  • 一个独立的回车符('\r'),
  • 下一行字符('\u0085'),
  • 行分隔符('\u2028')或
  • 段落分隔符('\u2029).

只要未设置必要的标志,这两个表达式就不相同.再次引用oracle网站:

如果UNIX_LINES激活了模式,则识别的唯一行终止符是换行符.

.除非DOTALL指定了标志,否则正则表达式匹配除行终止符之外的任何字符.