正则表达式在 AND 运算符中匹配多个字符串条件

RegEx match multiple string conditions in AND operator

我需要在长字符串中匹配以下规则:

 - key1=.*(a1|a2).* OR key2=.*(b1|b2|b3).* OR key3=.*(c1|c2|c3).*
 - AND key1=.*(d1|d2|d3|d4).*

'=' 的目的是 'contains any of'

我在 regex101.com 上尝试了以下正则表达式,但没有按预期工作:

.*((key1=(?=.*(a1|a2)))|(key2=(?=.*(b1|b2|b3)))|(key3=(?=.*(c1|c2|c3))))&(key1=(?=.*(d1|d2|d3|d4))).*

一些应该匹配的字符串:

key1=a2,d3
key2=b1,b3key1=d1
key2=b2key3=c3,a2key1=d4
key1=d2abckey2=b2,b3key1=a1

一些不应匹配的字符串:

key1=d2
key1=a1key2=b1
key2=b2key3=a1

我的正则表达式有什么问题?你怎么看? 非常感谢

您可以使用单个肯定前瞻来确保 key1 至少出现一次 d 和数字 1-4。

然后您可以使用另一个前瞻来断言密钥 1、密钥 2 或密钥 3 中的一个具有允许的数字。

请注意,您可以将 (a1|a2) 的交替 | 缩短为字符 class a[12]

^(?=.*key1=[a-z0-9,]*d[1-4])(?=.*(?:key1=a[12]|key2=b[123]|key3=c[123])).+

Regex demo

模式匹配:

  • ^ 字符串开头
  • (?= 正面前瞻
    • .*key1=[a-z0-9,]*d[1-4] 匹配 key1= 的值为 d1 d2 d3 d4 通过可选地匹配其前面允许的字符 [a-z0-9,]*
  • ) 关闭前瞻
  • (?=.*正向前瞻,断言右边的是
    • (?: 非捕获组列出备选方案
      • key1=a[12] 匹配 key1=a1key1=a2
      • |
      • key2=b[123] 将 key2 与允许的值匹配
      • |
      • key3=c[123] 将 key3 与允许的值匹配
    • )关闭非捕获组
  • ) 关闭正面前瞻
  • .+匹配1个或多个字符