繁体   English   中英

正则表达式:Eclipse中的转义模式,与以前的单词不匹配

[英]Regex: Escaped pattern in Eclipse, doesn't matches the same words as before

我正在codewars.com上从事KATA的工作,任务是用your sister替换字符串中出现的任何youuyouuu (不限数量)。

我有工作代码,并在正则表达式之后找出了youuuu的情况

(您* [\\ s \\ W])

现在在eclipse中,我需要转义“ \\”,因此表达式类似于:

(您* [\\\\ s \\\\ 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();
}

它不再与诸如youuuuuuuyouuyouu类的youuuuuuu匹配...如果它在在线Regex-Tester中工作,为什么在Eclipse中不起作用?

在Java中,当您使用matches()它会自动追加到正则表达式$的前面,并在结尾的^后面,就像您要匹配整个单词一样。 您可以使用MatcherPattern更好地解决这个问题。

您的正则表达式(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();

模式的末尾包含空格或非单词字符。 没有这样的角色,就不会匹配。 另外请注意,您在拆分“”开头,所以通过“youu”来autocorrect将匹配与模式“分裂后youu”,这将不匹配,因为没有结尾没有空白了。

除此之外,您的函数似乎已经实现了预期的功能,只是您似乎需要使用+而不是*来匹配至少一个u才能符合您所陈述的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM