我试图查找具有特定属性/文本(要作为组捕获)的锚(<a>
)HTML标记的所有出现(可能有零个或多个)。但是组(属性)可以按任何顺序发生。
正常工作正常的正则表达式:
<a\s+.*attr1="myattr".*attr2="(.+)".*attr3="(.+)".*>(.+)</a>
尝试了以下正则表达式,但没有成功:
<a\s+.*?((attr1="myattr".*?attr2="(.+?)".*?attr3="(.+?)")|(attr1="myattr".*?attr3="(.+?)".*?attr2="(.+?)")|(attr2="(.+?)".*?attr3="(.+?)".*?attr1="myattr")|(attr2="(.+?)".*?attr1="myattr".*?attr3="(.+?)")|(attr3="(.+?)".*?attr2="(.+?)".*?attr1="myattr")|(attr3="(.+?)".*?attr1="myattr".*?attr2="(.+?)")).*?>(.+?)</a>
不同属性顺序的输入字符串:
First <a attr1="myattr" attr2="value12" attr3="value13">text1</a>Second <a attr1="myattr" attr3="value13" attr2="value12">text2</a> Third <a attr2="value12" attr1="myattr" attr3="value13">text3</a>`
答案 0 :(得分:0)
使用先行代替常规匹配(但一般来说,您不应使用正则表达式来解析html):
/<a\s+(?=[^>]*\battr1\s*=\s*"myattr")(?=[^>]*\battr2\s*=\s*"([^"]+?)")(?=[^>]*\battr3\s*=\s*"([^"]+?)")[^>]*>(.+?)<\/a>/
`
<a attr1="myattr" attr2="smth" attr3="3">123</a>
<a attr1="myattr" attr3="3" attr2="smth">132</a>
<a attr2="smth" attr1="myattr" attr3="3">213</a>
<a attr2="smth" attr3="3" attr1="myattr">231</a>
<a attr3="3" attr1="myattr" attr2="smth">312</a>
<a attr3="3" attr2="smth" attr1="myattr">321</a>
`.replace(
/<a\s+(?=[^>]*\battr1\s*=\s*"myattr")(?=[^>]*\battr2\s*=\s*"([^"]+?)")(?=[^>]*\battr3\s*=\s*"([^"]+?)")[^>]*>(.+?)<\/a>/g,
(match, attr2, attr3, text) => console.log(text, attr2, attr3, match)
)