Java 正则表达式字符串中的两个相等字符 我从ReGEX开始,我需要帮助,我想验证有两个相等的字符,后面是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)

Java 正则表达式字符串中的两个相等字符 我从ReGEX开始,我需要帮助,我想验证有两个相等的字符,后面是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),java,regex,Java,Regex,目前,我有类似的东西,但它不能正常工作: (([B-Z])\1{2}A) | ([B-Z]{1}A[B-Z]{1}) | (A([B-Z])\1{2}) 我知道我没有接近正确的答案,我正在学习的东西。如果有人能帮我一把,我将非常感激 Pattern pattern = Pattern.compile("([B-Z])\\1A|A([B-Z])\\2|([B-Z])A\\3") 反向引用贯穿整个模式,交叉或运算符。一般来说,它并不适合正则表达式解决方案,尽管其他人也提到了这一点 请注意,您必须

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

(([B-Z])\1{2}A) | ([B-Z]{1}A[B-Z]{1}) | (A([B-Z])\1{2})
我知道我没有接近正确的答案,我正在学习的东西。如果有人能帮我一把,我将非常感激

Pattern pattern = Pattern.compile("([B-Z])\\1A|A([B-Z])\\2|([B-Z])A\\3")
反向引用贯穿整个模式,交叉或运算符。一般来说,它并不适合正则表达式解决方案,尽管其他人也提到了这一点

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

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

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

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

检查:

这可以非常优雅地完成:

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

lookahead中的
[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)



一般来说,您可能需要研究反向引用以及如何将它们与捕获组一起使用,以便根据当前捕获的字符匹配字符:问题是在您的情况下,像
[a-Z]{2}
这样的东西将匹配
AB
AZ
和任何其他2符号正则表达式,除了像
a{2}a | B{2}a | C{2}a
等,或者使用带有反向引用的捕获组之外,我看不到一个表达“来自此集合的同一个字母重复”的好方法。但是我会避免用正则表达式解决这种问题,它变得太复杂和脆弱。提取正则表达式中的两个首字母,然后检查它们在java中是否相同。这个答案可能会帮助您:-非常非常感谢!它工作得很好!我一直在思考如何解决它几个小时了。现在我需要了解它是如何工作的并继续学习。再次感谢大家!我在正则表达式中发现的一个错误是
([B-Z])\1{2}
实际上指的是相同字符的3,因为
([B-Z])
已经指的是一个,而
\1{2}
指的是另外两个。由于前两个选项中缺少尾随
\B
,这与
BABA
BBAA
不正确匹配,和
ABAB
AABB
,因为在最后两个备选方案中缺少领先的
\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