正则表达式以不同的顺序查找多个单词

时间:2015-03-29 03:03:49

标签: regex

我试图查找具有特定属性/文本(要作为组捕获)的锚(<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>`

1 个答案:

答案 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)
)