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

时间:2016-02-07 02:00:11

标签: java regex xml

我开发了一个正则表达式来识别文本文件中的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]逻辑上应相当于.我没有使用贪婪的过滤器,那么可能有什么区别?

2 个答案:

答案 0 :(得分:13)

正则表达式.\s\S不等效,因为.默认情况下不会捕获行终止符(如新行)。

根据oracle website.匹配

  

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

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

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

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

  

如果激活UNIX_LINES模式,则只有行终止符   识别为换行符。

     

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

答案 1 :(得分:4)

Here是一张说明所有正则表达式命令的工作表。

基本上,\s\S将拾取所有字符,包括换行符。而.默认情况下不会拾取行终止符(需要设置某些标记来拾取它们)。