编写正则表达式java的麻烦

ash*_*thy 1 java regex

字符串始终由两个不同的交替字符组成.例如,如果字符串的两个不同字符是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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*eas 5

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

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

输入必须至少两个字符长.空字符串和单字符字符串不匹配.

作为java代码,那将是:

if (a.matches("(.)(.)(?:\\1\\2)*\\1?")) {
Run Code Online (Sandbox Code Playgroud)

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

1)注意regex101需要使用^$,这是matches()方法所暗示的.它还需要使用标志gm同时展示多个示例.


UPDATE

正如奥斯汀安德森指出的那样:

失败yyyyyyyyyxxxxxx

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

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

请参阅regex101.com.

或者您可以使用Austin Anderson的简单版本:

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