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

2022-09-04 08:27:35

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

<\?xml\s+version="[\d\.]+"\s*\?>\s*<\s*rdf:RDF[^>]*>[\s\S]*?<\s*\/\s*rdf:RDF\s*>

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

据我所知,意味着所有的空白符号和所有非空白符号在逻辑上应该等同于我没有使用贪婪的过滤器,那么可能有什么区别呢?\s\S[^\s][\s\S].


答案 1

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

根据甲骨文网站,匹配.

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

而行终止符是以下任一项:

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

只要未设置必要的标志,这两个表达式就不等效。再次引用甲骨文网站:

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

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


答案 2

这是一个解释所有正则表达式命令的工作表。

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