我有以下正则表达式,我用它来查找<icon use="some-id" class="some-class" />
:
(?:<icon )(?=(?:.*?(?:use=(?:"|')(.*?)(?:"|')))?)(?=(?:.*?(?:class=(?:"|')(.*?)(?:"|')))?)(?:.*?)(?: \/)?[^?](?:>)
这主要是有效的,除非我不指定一个类,但是在同一行上的另一个元素上指定一个类,它与其他元素类相匹配,即使完整匹配被报告为仅仅是图标元素。
例如:
<icon use="search" /> <div class="test"></div>
$1
为search
,$2
为test
,即使它们不属于同一元素。 $&
正在报告<icon use="search" />
。
我确定我错过了关于正则表达式工作方式的明显方法。
答案 0 :(得分:4)
.*?
匹配之前的class=
将匹配其所需的任何内容,以便使正则表达式的其余部分匹配 - 包括第一个标记的结尾和第二个标记的开头,以及可能介于两者之间的一切。您放置的唯一限制是它无法跨越行边界,因为默认情况下换行符不会与.
匹配。为了使这项工作更加可靠,您需要限制正则表达式的那一部分,使其不能跨越标记边界:[^<]+?
(一个或多个字符不是左括号,尽可能少地匹配)应该做的工作。