字符串始终由两个不同的交替字符组成。例如,如果字符串的两个不同字符是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()
方法隐含的。它还需要使用标志g
和m
来同时展示多个示例。更新
作为pointed out by Austin Anderson:
在
yyyyyyyyy
或xxxxxx
上失败为防止这种情况,我们可以添加零宽度的负前瞻,以确保输入不以两个相同字符开头:
(?!(.)\1)(.)(.)(?:\2\3)*\2?
请参见regex101.com。
或者您可以使用Austin Anderson's simpler version:
(.)(?!\1)(.)(?:\1\2)*\1?