猿问

正则表达式字符串中的两个相等字符

我从 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})

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


慕妹3242003
浏览 613回答 3
3回答

慕姐4208626

这可以相当优雅地完成:\b(?=[A-Z]{3}\b)A?([B-Z])A?\1A?\bregex101 上的演示[A-Z]{3}由于\b两边都有,lookahead的内部断言序列的长度正好是 3 个字母。TheA?([B-Z])A?\1A?断言除了 之外还有两个相同的 letter 实例A,它们可以A在任何时候穿插在它中间,并且由于两边\b都在旁边,断言没有其他任何东西混入。这也可以推广到任意数量的重复:\b(?=[A-Z]{3}\b)(?:\1|(?!\2)([B-Z])()|(?!\3)A())+\b\2只需更改{3}为您想要的任何总字符数(即,“A”的重复数加 1)。regex101 上的演示在线试用!(爪哇)

海绵宝宝撒

用于\b仅匹配单词,并为每个|.\b([B-Z])\1A|([B-Z])A\2|A([B-Z])\3\b检查:https : //regexr.com/42bp0

慕娘9325324

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\$"
随时随地看视频慕课网APP

相关分类

Java
我要回答