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

问题描述 投票:1回答:1

我试图找到具有特定属性/文本(作为组捕获)的锚(<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>`
regex
1个回答
0
投票

使用前瞻而不是正常匹配(但在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)
)
© www.soinside.com 2019 - 2024. All rights reserved.