编写正则表达式java的麻烦

时间:2017-07-25 18:08:51

标签: 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;
}

2 个答案:

答案 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()。它还需要使用标志gm来同时展示多个示例。

<强>更新

作为pointed out by Austin Anderson

  

yyyyyyyyyxxxxxx

上失败

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

(?!(.)\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;
}

Code Demo