我试图找到具有特定属性/文本(作为组捕获)的锚(<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>`
使用前瞻而不是正常匹配(但在jeneral中你不应该使用正则表达式来解析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)
)