【问题标题】:Regex somehow combining AND-operand, NOT-operand, and capture group正则表达式以某种方式结合了 AND 操作数、NOT 操作数和捕获组
【发布时间】:2018-05-07 16:01:54
【问题描述】:

我知道您可以通过以下方式在正则表达式中使用非操作数:

  • [^AB]:匹配除"A""B" 之外的任何内容
  • A(?!B):匹配 "A",不跟随 "B"
  • (?<!A)B):匹配前面没有 "A""B"

但是是否可以将其中任何一个与 AND 和捕获组匹配一起使用?如:

  • 不工作的伪代码([AB])([AB]&&[^\\1]):匹配"AB""BA"(但不匹配"AA""BB"

我知道正则表达式中并没有真正的 AND 操作数,这是另一件应该同时修复的事情..

请注意,以上只是一个示例,在我的正则表达式中,AB 有点长,并且捕获组不在它旁边。我只是隔离了这个问题中的问题部分。

【问题讨论】:

  • @Gurman 完美!随意将其作为答案,然后我会投票并接受它。 :)

标签: java regex match regex-group


【解决方案1】:

试试这个正则表达式:

^(?!([AB])\1)[AB]+$

Click for Demo

说明:

  • ^ - 断言字符串的开头
  • (?!([AB])\1) - 否定前瞻验证 A 后面没有另一个 AB 后面没有另一个 B
  • [AB]+ - 匹配出现 1 次以上的 AB
  • $ - 断言字符串的结尾

【讨论】:

    【解决方案2】:

    代码

    See regex in use here

    ([AB])(?!\1)[AB]
    

    在某些正则表达式引擎中,您可以稍微通过使用以下(使用递归)来简化这一点 - Java 不允许递归,因此这种方法在 Java 中是不可能的。

    See regex in use here

    ([AB])(?!\1)(?1)
    

    说明

    • ([AB]) 捕获集合AB 中的一个字符到捕获组1
    • (?!\1) 负前瞻确保后面的内容与捕获组 1 最近捕获的文本不匹配
    • [AB]匹配集合中的一个字符AB

    【讨论】:

    • 很好,这实际上比 Gurman 的方法更具可读性。但由于他的评论是最快的,我已经说过我会接受,我会接受他的。仍然+1,我可能会使用您的答案。谢谢!
    • @KevinCruijssen 不用担心,我很高兴能帮上忙。他的评论在速度方面超过了我的回答:(哈哈
    • 嗯,我现在注意到你的两个答案有所不同。你的匹配部分字符串,但古尔曼匹配整个字符串。当我在您的正则表达式中使用 ^...$ 时,它不再起作用了。有趣的。 :)
    • @KevinCruijssen 您是否在 regex101 中为多行设置了 m 修饰符。它适用于^...$。此外,他的正则表达式匹配 2+ 个字符,而我的正好匹配 2 个
    • @KevinCruijssen 这是一个更大的正则表达式的一部分吗?
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多