我已经开发了一个正则表达式来识别文本文件中的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]
在逻辑上应该等同于.
。我没有使用贪婪模式,那么可能有什么区别呢?
.
不会匹配换行符。如果使用Pattern.DOTALL
标志,它可能匹配所有字符(包括换行符)。设置了[\s\S]
,其中包括所有空格 \s 和所有非空格 \S,有效地代表所有字符(包括换行符)。 - Pshemo