regex Java正则表达式中的[\s\S]*?和.*?有什么区别?

kr98yfug  于 2023-02-05  发布在  Java
关注(0)|答案(3)|浏览(295)

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

bvuwiixz

bvuwiixz1#

正则表达式.\s\S不等价,因为.在默认情况下不捕捉行终止符(如换行符)。
根据甲骨文网站,.匹配
任何字符(可以与行终止符匹配,也可以不匹配)
而行终止符是以下任何一种:

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

这两个表达式并不等价,只要不设置必要的标志。再次引用甲骨文网站的话:
如果UNIX_LINES模式被激活,那么唯一识别的行终止符是换行符。
除非指定了DOTALL标志,否则正则表达式.匹配除行结束符以外的任何字符。

lbsnaicq

lbsnaicq2#

Here是解释所有regex命令的工作表。
基本上,\s\S将拾取所有字符,包括换行符,而默认情况下.不拾取行终止符(需要设置某些标志来拾取它们)。

j91ykkif

j91ykkif3#

这就像在javascript虽然我不习惯java,但java是一种类型的程序,它是非常有用的,在我们的真实的生活中。

相关问题