字符串始终由两个不同的交替字符组成.例如,如果字符串的两个不同字符是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)
使用正则表达式(.)(.)(?:\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()方法所暗示的.它还需要使用标志g并m同时展示多个示例.
UPDATE
失败
yyyyyyyyy或xxxxxx
为了防止这种情况,我们可以添加零宽度负前瞻,以确保输入不以两个相同的字符开头:
(?!(.)\1)(.)(.)(?:\2\3)*\2?
请参阅regex101.com.
或者您可以使用Austin Anderson的简单版本:
(.)(?!\1)(.)(?:\1\2)*\1?
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |