每个字母使Java正则表达式'[abc] +'匹配一次

时间:2016-11-21 19:58:05

标签: java regex

String[] words = {"a","ab","ac","abc","aac","aa"};
for(String str:words)   {
    if(str.matches("[abc]+"))  {
        System.out.println(str);
    }
}

此代码打印

  

A,AB,AC,ABC,AAC,AA

这几乎是我想要的,除了我不希望一封信被匹配两次。我想更改正则表达式[abc]+,以便匹配只发生一次。由于aac匹配两次,因此不应打印aaaa。 我可以这样做吗?

3 个答案:

答案 0 :(得分:2)

使用否定预测,您可以使用此正则表达式:

^(?:([abc])(?!.*\1))+$

RegEx Demo

如果您想允许任何不仅仅是[abc]的角色,请使用:

^(?:(.)(?!.*\1))+$
  • (.)匹配并分组任何字符
  • (?!.*\1)是对所捕获的每个字符断言的负向前瞻,即在当前位置之前不存在相同的字符。
  • (?:...)+在非捕获组中匹配字符和前瞻的组,重复一次或多次以匹配整个字符串。

答案 1 :(得分:0)

如果你真的想要一个正则表达式,如果你只允许使用[abc],那么很容易检查所有可能性:D。

String[] words = { "a", "ab", "ac", "abc", "aac", "aa" };
for (String str : words) {
    if (str.matches("(abc|ab|acb|ac|a|bac|ba|bca|bc|b|cab|ca|cba|cb|c)")) {
        System.out.println(str);
    }
}

否则,您可以检查字符串是否与[abc]+匹配,但不包含"([a-c]).*\\1"

答案 2 :(得分:0)

ab?c?您要找的是什么?