我正在codewars.com处理KATA,并负责替换you
,u
和youuu
的任何出现(不限数量的你) )在带有your sister
的字符串中。
我有工作代码,并为案例youuuu
(你* [\ 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
之类的字词,或youu
或youu
...
如果在适用于在线的Regex-Tester中工作,为什么它在Eclipse中不起作用?
答案 0 :(得分:1)
在Java中,当您使用matches()
时,它会自动附加到前面的正则表达式$
和^
到最后,表现得像是要匹配整个单词。您可以使用Matcher
和Pattern
来更好地解决这个问题。
答案 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
到符合你陈述的问题。