我开发了一个正则表达式来识别文本文件中的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]
逻辑上应相当于.
我没有使用贪婪的过滤器,那么可能有什么区别?
答案 0 :(得分:13)
正则表达式.
和\s\S
不等效,因为.
默认情况下不会捕获行终止符(如新行)。
根据oracle website,.
匹配
任何字符(可能与行终止符匹配也可能不匹配)
虽然行终止符是以下任何一种:
- 换行符(换行符)(
'\n'
),- 回车符后面紧跟换行符(
"\r\n"
),- 一个独立的回车符(
'\r'
),- 下一行字符(
'\u0085'
),- 行分隔符(
'\u2028'
)或- 段落分隔符(
'\u2029
)。
只要未设置必要的标志,这两个表达式就不相同。再次引用oracle网站:
如果激活
UNIX_LINES
模式,则只有行终止符 识别为换行符。正则表达式
.
匹配除行之外的任何字符 终止符,除非指定了DOTALL
标志。
答案 1 :(得分:4)
Here是一张说明所有正则表达式命令的工作表。
基本上,\s\S
将拾取所有字符,包括换行符。而.
默认情况下不会拾取行终止符(需要设置某些标记来拾取它们)。