【发布时间】:2012-10-24 03:11:56
【问题描述】:
我目前正在尝试使用正则表达式解决来自 codingbat.com 的问题。
我是新来的,所以分步解释将不胜感激。我可以使用 String 方法相对容易地解决这个问题,但我正在尝试使用正则表达式。
这里是提示: 给定一个字符串和一个非空单词字符串,返回一个由字符串中每个单词出现之前和之后的每个字符组成的字符串。忽略单词前后没有字符的情况,如果字符在两个单词之间,它可能会被包含两次。
wordEnds("abcXY123XYijk", "XY") → "c13i"
wordEnds("XY123XY", "XY") → "13"
wordEnds("XY1XY", "XY") → "11"
等
到目前为止我的代码:
String regex = ".?" + word+ ".?";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
String newStr = "";
while(m.find())
newStr += m.group().replace(word, "");
return newStr;
问题是当连续有多个单词实例时,程序会错过单词前面的字符,因为 m.find() 超出了它。
例如:wordEnds("abc1xyz1i1j", "1")应该返回"cxziij",但是我的方法返回"cxzij",而不是重复"i"
我希望有一个简洁的解决方案,并附上我可以应用于其他一般正则表达式问题的解释。
【问题讨论】:
-
查看这个关于环视正则表达式的答案stackoverflow.com/a/2995621/324900
-
@user1796994 查看我未删除、已修复的单行解决方案答案
-
@user1796994 请参阅我的(已编辑)答案,了解如何在一行(包括测试代码)中执行此操作。您可能不会认为它“不杂乱”,但它肯定比多线解决方案 IMHO 更杂乱。