我从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})
我知道我还没有接近正确的答案,即我正在学习的内容。如果有人可以帮我,我将非常感激。
答案 0 :(得分:1)
答案 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
前瞻中的[A-Z]{3}
断言序列的长度正好是3个字母,这要归功于两边都有\b
。 A?([B-Z])A?\1A?
断言,除了A
之外,还有两个相同的字母实例,在任何时候都可以将A
插入其中,并且还要感谢\b
的支持双方都断言没有其他东西混入。
这也可以概括为任意数量的重复:
\b(?=[A-Z]{3}\b)(?:\1|(?!\2)([B-Z])()|(?!\3)A())+\b\2
只需将{3}
更改为所需的字符总数即可(即重复次数加上“ A”的1)。