正则表达式过度匹配问题
现在有这个字符串,想通过正则匹配name后面的书名,
<book id=100000059 name=测试极品全能巨星></book> <book id=100000059 name=测试极品全能巨星11></book>
正则表达式为
<book.+.><\/book>
发现只能匹配到第一个,因为有重复元素,这个正则表达式匹配的为开头和结尾,中间的忽略掉了, 这是因为*和+都是贪婪型的元字符,他们在匹配时可能从一段文字开头匹配到文字结尾,而不是从第一段开头碰到第一个匹配为止,
当不需要这种贪婪行为时,可以使用这些元字符的懒惰型版本,会尽可能匹配少的元素,懒惰型元符只需要在贪婪型后面加上?
*
-> *?
+
-> +?
{n,} ->
{n,}?
所有正则表达式变为下面这个,可以全部匹配到
<book.+?.><\/book>