我开发了一个正则表达式来识别文本文件中的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]
在逻辑上应该等价于.
,我没有使用贪婪过滤器,所以有什么区别?
3条答案
按热度按时间bvuwiixz1#
正则表达式
.
和\s\S
不等价,因为.
在默认情况下不捕捉行终止符(如换行符)。根据甲骨文网站,
.
匹配任何字符(可以与行终止符匹配,也可以不匹配)
而行终止符是以下任何一种:
'\n'
),"\r\n"
),'\r'
),'\u0085'
),'\u2028'
),或'\u2029
)。这两个表达式并不等价,只要不设置必要的标志。再次引用甲骨文网站的话:
如果
UNIX_LINES
模式被激活,那么唯一识别的行终止符是换行符。除非指定了
DOTALL
标志,否则正则表达式.
匹配除行结束符以外的任何字符。lbsnaicq2#
Here是解释所有regex命令的工作表。
基本上,
\s\S
将拾取所有字符,包括换行符,而默认情况下.
不拾取行终止符(需要设置某些标志来拾取它们)。j91ykkif3#
这就像在javascript虽然我不习惯java,但java是一种类型的程序,它是非常有用的,在我们的真实的生活中。