正则表达式:匹配排列与重复字符,其中一个字符不能出现多次

时间:2012-06-01 11:33:33

标签: java regex permutation restriction

正则表达式应匹配所有字符串,长度在2到3个字符之间,并且只包含A和B([AB] {2,3})。但它也应该只匹配字符串,其中包含最多一个B。

允许的字符串:

  

AA
  AB
  BA
  AAA
  AAB
  ABA
  BAA

不允许:

  

ABB< - 两个B的

单个正则表达式是否可以实现这一目标?我尝试过类似的东西:

  

([AB] {2,3})(小于?=([B] * A [B] *){2})

但它不适用于Java,因为它不支持Look-behind组的可变长度。

  

线程“main”中的异常java.util.regex.PatternSyntaxException:Look-behind组在索引28附近没有明显的最大长度   ([AB] {2,3})(小于?=([B] * A [B] *){2})

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您可以使用否定前瞻来确保字符串没有两个B

^(?!.*B.*B)[AB]{2,3}$

See it

答案 1 :(得分:2)

嗯,您可以单独列出选项:

^(A{2,3}|A{1,2}B|ABA|BA{1,2})$
  ↑      ↑       ↑   ↑
  │      │       │   └─ starting with B
  │      │       └───── B in the middle
  │      └───────────── B at the end
  └──────────────────── only A

答案 2 :(得分:0)

试试这个

\b(?:A{1,2}B|BA{1,2}|A{2,3}|ABA?)\b