我从 RegEx 开始,我需要帮助,我想验证是否有两个相等的字符后跟 A,或者它们是分开的(但保持不变)并在中间 A。我用例子解释:BBA -> trueABB -> trueBAB -> trueCCA -> trueABC -> falseBAC -> falseBBBA -> 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 回答

慕姐4208626
TA贡献1852条经验 获得超7个赞
这可以相当优雅地完成:
\b(?=[A-Z]{3}\b)A?([B-Z])A?\1A?\b
[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)。

海绵宝宝撒
TA贡献1809条经验 获得超8个赞

慕娘9325324
TA贡献1783条经验 获得超4个赞
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\$"
添加回答
举报
0/150
提交
取消