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
匹配两次,因此不应打印aa
和aa
。
我可以这样做吗?
答案 0 :(得分:2)
使用否定预测,您可以使用此正则表达式:
^(?:([abc])(?!.*\1))+$
如果您想允许任何不仅仅是[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?
您要找的是什么?