正则表达式仅允许给定字符类中的一个(可能重复)字符

nop*_*ens 1 java regex

我需要检查字符串是否只包含给定字符类中的一个不同字符。一些简单的例子:

"aa", "bbbbb", "c"匹配此正则表达式[abc]+,但正则表达式也匹配"abbb" or "abcbb"在我的情况下无效的正则表达式。因此我无法使用它。

示例代码:

String[] input = {"a", "aaa", "ab", "b", "bbbb", "abc", "ccc"};
for(String str :input){
    if(str.matches("[abc]+")){
        System.out.println(str + ": valid");
    }
    else {
        System.out.println(str + ": not valid");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的内容将为输入数组中的每个字符串打印有效的内容,这不是我想要的。有效输入只是具有不同字符的字符串。我可以通过以下方式实现它,我需要or在 if 语句中使用多个。

for(String str :input){
    if(str.matches("[a]+")||str.matches("[b]+")||str.matches("[c]+")){
        System.out.println(str + ": valid");
    }
    else {
        System.out.println(str + ": not valid");
    }
}
Run Code Online (Sandbox Code Playgroud)

如何获得与第二种方法相同的结果,但写得紧凑,因为当字符类增长并且字符类发生变化时,这将不可读,我需要更改 if 条件?

预期的:

a: valid
aaa: valid
ab: not valid
b: valid
bbbb: valid
abc: not valid
ccc: valid
Run Code Online (Sandbox Code Playgroud)

Mat*_*ndh 5

您可以使用\1(转义为\\1) 来引用第一个子组的匹配项,例如:

^([a-z])\1+$
Run Code Online (Sandbox Code Playgroud)

.. 将匹配 az 后跟其本身至少一次作为字符串中的唯一字符(^ 和 $ 可能是隐含的.matches,我不太熟悉正则表达式的 Java 特定问题)。

然后,您需要进行一项额外检查,看看字符串的长度是否为 1 并包含a-z(如果您想避免允许 1、2 等以及其他特殊字符)。

  • 您可能需要 `^([abc])\1*$` 因为 OP 也希望允许单个字符。 (2认同)