正则表达式在 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])).+
模式匹配:
^
字符串开头
(?=
正面前瞻
.*key1=[a-z0-9,]*d[1-4]
匹配 key1= 的值为 d1
d2
d3
d4
通过可选地匹配其前面允许的字符 [a-z0-9,]*
)
关闭前瞻
(?=.*
正向前瞻,断言右边的是
(?:
非捕获组列出备选方案
key1=a[12]
匹配 key1=a1
或 key1=a2
|
或
key2=b[123]
将 key2 与允许的值匹配
|
或
key3=c[123]
将 key3 与允许的值匹配
)
关闭非捕获组
)
关闭正面前瞻
.+
匹配1个或多个字符
我需要在长字符串中匹配以下规则:
- 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])).+
模式匹配:
^
字符串开头(?=
正面前瞻.*key1=[a-z0-9,]*d[1-4]
匹配 key1= 的值为d1
d2
d3
d4
通过可选地匹配其前面允许的字符[a-z0-9,]*
)
关闭前瞻(?=.*
正向前瞻,断言右边的是(?:
非捕获组列出备选方案key1=a[12]
匹配key1=a1
或key1=a2
|
或key2=b[123]
将 key2 与允许的值匹配|
或key3=c[123]
将 key3 与允许的值匹配
)
关闭非捕获组
)
关闭正面前瞻.+
匹配1个或多个字符