字符串始终由两个不同的交替字符组成。例如,如果字符串的两个不同字符是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;
}
答案 0 :(得分:5)
使用正则表达式(.)(.)(?:\1\2)*\1?
。
(.)
匹配任何字符,并将其捕获为第1组(.)
匹配任何字符,并将其捕获为第2组\1
匹配与第1组中捕获的字符相同的字符\2
匹配与第2组中捕获的字符相同的字符(?:\1\2)*
匹配0组或更多对组1 + 2 \1?
可选择匹配悬空组1 输入长度必须至少为两个字符。空字符串和单字符字符串不匹配。
作为java代码,那将是:
if (a.matches("(.)(.)(?:\\1\\2)*\\1?")) {
有关工作示例 1 ,请参阅regex101.com。
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?
答案 1 :(得分:1)
实际上你的正则表达式几乎是正确的但问题是你已经将你的正则表达式包含在2个字符类中,你需要在最后匹配一个可选的第二个字符。
你只需要使用这个正则表达式:
public static int check(String a) {
if (a.length() < 2)
return 0;
char on = a.charAt(0);
char to = a.charAt(1);
if(on != to) {
String re = on+"("+to+on+")*"+to+"?|"+to+"("+on+to+")*"+on+"?";
System.out.println("re: " + re);
if(a.matches(re)) {
return a.length();
}
}
return 0;
}