字符串始终由两个不同的交替字符组成。例如,如果字符串的两个不同字符是x和y,则t可以是xyxyx或yxyxy,但不能是xxyy或xyyx。


但是a.matches()始终返回false,输出变为0。帮助我了解这里的问题。

public static int check(String a) {
    char on = a.charAt(0);
    char to = a.charAt(1);
    if(on != to) {
        if(a.matches("["+on+"("+to+""+on+")*]|["+to+"("+on+""+to+")*]"))  {
            return a.length();
        }
    }
    return 0;
}

最佳答案

使用正则表达式(.)(.)(?:\1\2)*\1?


(.)匹配任何字符,并将其捕获为组1
(.)匹配任何字符,并将其捕获为组2
\1匹配与第1组中捕获的字符相同的字符
\2匹配与第2组中捕获的字符相同的字符
(?:\1\2)*匹配0个或更多对第1 + 2组
\1?(可选)匹配悬空组1


输入的字符必须至少两个字符。空字符串和一个字符的字符串将不匹配。

作为Java代码,它将是:

if (a.matches("(.)(.)(?:\\1\\2)*\\1?")) {


有关工作示例,请参见regex101.com 1。

1)请注意,regex101需要使用^$,这是matches()方法隐含的。它还需要使用标志gm来同时展示多个示例。



更新

作为pointed out by Austin Anderson


  在yyyyyyyyyxxxxxx上失败


为防止这种情况,我们可以添加零宽度的负前瞻,以确保输入不以两个相同字符开头:

(?!(.)\1)(.)(.)(?:\2\3)*\2?

请参见regex101.com

或者您可以使用Austin Anderson's simpler version

(.)(?!\1)(.)(?:\1\2)*\1?

10-08 02:02