为什么正则表达式在其界限之外找到匹配?

时间:2017-05-01 14:26:06

标签: regex

我有以下正则表达式,我用它来查找<icon use="some-id" class="some-class" />

(?:<icon )(?=(?:.*?(?:use=(?:"|')(.*?)(?:"|')))?)(?=(?:.*?(?:class=(?:"|')(.*?)(?:"|')))?)(?:.*?)(?: \/)?[^?](?:>)

这主要是有效的,除非我指定一个类,但是在同一行上的另一个元素上指定一个类,它与其他元素类相匹配,即使完整匹配被报告为仅仅是图标元素。

例如:

<icon use="search" /> <div class="test"></div>

$1search$2test,即使它们不属于同一元素。 $&正在报告<icon use="search" />

我确定我错过了关于正则表达式工作方式的明显方法。

1 个答案:

答案 0 :(得分:4)

.*?匹配之前的class=将匹配其所需的任何内容,以便使正则表达式的其余部分匹配 - 包括第一个标记的结尾和第二个标记的开头,以及可能介于两者之间的一切。您放置的唯一限制是它无法跨越行边界,因为默认情况下换行符不会与.匹配。为了使这项工作更加可靠,您需要限制正则表达式的那一部分,使其不能跨越标记边界:[^<]+?(一个或多个字符不是左括号,尽可能少地匹配)应该做的工作。