【问题标题】:RegEx match multiple string conditions in AND operator正则表达式匹配 AND 运算符中的多个字符串条件
【发布时间】:2021-10-07 16:20:08
【问题描述】:

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

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

'=' 意为'包含任何'

我在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

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

【问题讨论】:

    标签: regex pattern-matching logical-operators


    【解决方案1】:

    您可以使用单个正向前瞻来确保 key1 存在,并且至少出现 d 和数字 1-4。

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

    请注意,您可以将(a1|a2) 的替换| 缩短为字符类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 个或多个字符

    【讨论】:

    • 感谢您的回答,它实际上正确匹配 key1=d3,a2 但是如果您将 d3 与 a2 key1=a2,d3 反转,它就不再适用了?有什么建议吗?
    • @G.Joe 如果你想要所有的键都这样,那么你可以选择先重复所有允许的字符^(?=.*key1=[a-z0-9,]*d[1-4])(?=.*(?:key1=[a-z0-9,]*a[12]|key2=[a-z0-9,]*b[123]|key3=[a-z0-9,]*c[123])).+regex101.com/r/cjLeDW/1
    猜你喜欢
    • 2021-08-14
    • 2015-07-31
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多