正则表达式:Eclipse中的Escaped模式,与之前的单词不匹配

时间:2017-06-28 08:00:01

标签: java regex eclipse escaping

我正在codewars.com处理KATA,并负责替换youuyouuu的任何出现(不限数量的你) )在带有your sister的字符串中。

我有工作代码,并为案例youuuu

找出了Regex-expression
  

(你* [\ S \ W])

现在在eclipse中,我需要逃避" \",所以表达式如下:

  

(你* [\\小号\\ W])

但是,这与前面的表达式不匹配。

这是我的代码:

public static String autocorrect(String input) {
    String[] splittedInput = input.split(" ");
    StringBuilder formattedString = new StringBuilder();

    for (String word : splittedInput){
        switch (word) {
        case "u":
            formattedString.append("your sister");
            break;
        case "you":
            formattedString.append("your sister");
            break;
        default:
            if (word.matches("(you*[\\s\\W])")){
                formattedString.append("your sister");
            }
            else {
             formattedString.append(word);   
            }
        }
        formattedString.append(" ");
    }

    return formattedString.toString();
}

它不再匹配youuuuuuu之类的字词,或youuyouu ... 如果在适用于在线的Regex-Tester中工作,为什么它在Eclipse中不起作用?

3 个答案:

答案 0 :(得分:1)

在Java中,当您使用matches()时,它会自动附加到前面的正则表达式$^到最后,表现得像是要匹配整个单词。您可以使用MatcherPattern来更好地解决这个问题。

答案 1 :(得分:0)

您的正则表达式(you*[\\s\\W])匹配包含yo的字符串,后跟任意数量的u(也可能为零),后跟强制空格或非单词字符。

您可能希望将其更改为:

(you+[\\s\\W]?)

但是,您的初始表达式应与已与您的说明相反的youu!匹配。

此外,您可能还希望使用Matcher来匹配字符串中的子序列与您的模式匹配,如其他答案中所述:

final Pattern pattern = Pattern.compile("(you+[\\s\\W]?)");
final Matcher matcher = pattern.matcher("youuuuuu!");
matcher.find();

答案 2 :(得分:0)

您的模式最后包含空格或非单词字符。没有这样的角色,就不会匹配。另请注意,您在开头拆分为“”,因此将“youu”传递给autocorrect将与分割后的“youu”模式匹配,这将不匹配,因为最后不再有空格。

除此之外,似乎你的功能做了它应该做的事情,除了它似乎你需要使用+而不是*来匹配至少一个u到符合你陈述的问题。