RegEx字符串中两个相等的字符

时间:2018-11-01 17:07:26

标签: java regex

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

我知道我还没有接近正确的答案,即我正在学习的内容。如果有人可以帮我,我将非常感激。

3 个答案:

答案 0 :(得分:1)

使用A仅匹配单词,并返回每个\b的引用。

|

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

答案 1 :(得分:0)

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 :(得分:0)

这可以相当优雅地完成:

\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)