【问题标题】:RegEx two equal characters in String正则表达式字符串中的两个相等字符
【发布时间】:2023-03-14 03:55:01
【问题描述】:

我从 RegEx 开始,我需要帮助,我想验证是否有两个相等的字符后跟 A,或者它们是分开的(但保持不变)并且在中间 A。我举例说明:

BBA -> true
ABB -> true
BAB -> true
CCA -> true
ABC -> false
BAC -> false
BBBA -> false (there have to be only two)
ABBB -> false (there have to be only two)

目前我有类似的东西,但它不能正常工作:

(([B-Z])\1{2}A) | ([B-Z]{1}A[B-Z]{1}) | (A([B-Z])\1{2})

我知道我没有接近正确答案,我正在学习。如果有人能帮我一把,我将不胜感激。

【问题讨论】:

  • 一般来说,您可能需要查看反向引用以及如何将它们与捕获组一起使用,以便您可以根据当前捕获的字符匹配一个字符:stackoverflow.com/questions/21428545/… 在您的情况下,问题是这样的[A-Z]{2} 将匹配 ABAZ 和任何其他 2 符号正则表达式,除了 A{2}A | B{2}A | C{2}A 等或使用捕获之外,我没有看到表达“重复该集合中的相同字母”的好方法具有反向引用的组。
  • 但是我会避免用正则表达式解决这种问题,它变得太复杂和脆弱。在正则表达式中提取2个首字母,然后检查它们在java中是否相同。
  • 这个答案可能对您有所帮助:- stackoverflow.com/a/16717823/7560986

标签: java regex


【解决方案1】:
Pattern pattern = Pattern.compile("([B-Z])\\1A|A([B-Z])\\2|([B-Z])A\\3")

后向引用贯穿整个模式并跨越 OR 运算符。虽然正如其他人所提到的,但一般来说,它并不适合正则表达式解决方案。

请注意,您必须根据需要添加 ^ 和 $ 以仅匹配此模式,如下所示:

"^([B-Z])\\1A\$|^A([B-Z])\\2\$|^([B-Z])A\\3\$"

【讨论】:

    【解决方案2】:

    使用\b 仅匹配单词,并为每个| 反向引用。

    \b([B-Z])\1A|([B-Z])A\2|A([B-Z])\3\b
    

    检查:https://regexr.com/42bp0

    【讨论】:

    • 非常非常非常感谢!它完美地工作!我一直在考虑如何解决它几个小时。现在我需要了解它是如何工作的并继续学习。再次,非常感谢!
    • 我在你的正则表达式中发现的一个错误是 ([B-Z])\1{2} 实际上指的是同一个字符的 3 个,因为([B-Z]) 已经指的是一个,而\1{2} 指的是另外两个。跨度>
    • 这与 BABABBAA 不正确匹配,因为前两个选项中缺少尾随 \b,而 ABABAABB 由于缺少前导 \b最后两种选择。固定版本将是 \b([A-Z])\1A\b|\b([A-Z])A\2\b|\bA([A-Z])\3\b 或通过对备选方案进行分组,\b(?:([A-Z])\1A|([A-Z])A\2|A([A-Z])\3)\b
    【解决方案3】:

    这可以相当优雅地完成:

    \b(?=[A-Z]{3}\b)A?([B-Z])A?\1A?\b

    Demo on regex101

    前瞻中的[A-Z]{3} 断言序列的长度正好是3 个字母,这要归功于两边都有\bA?([B-Z])A?\1A? 断言除了A 之外,还有两个相同的字母实例,A 可以在任何时候穿插其中,并且由于两侧还有\b,断言没有别的混进去了。


    这也可以推广到任意数量的重复:

    \b(?=[A-Z]{3}\b)(?:\1|(?!\2)([B-Z])()|(?!\3)A())+\b\2

    只需将{3} 更改为您想要的任意总字符数(即,重复次数加上“A”的 1)。

    Demo on regex101
    Try it online! (Java)

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2021-06-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多