我正试图从文本文件中删除重复的连续单词,有人提到我可以做这样的事情:
Pattern p = Pattern.compile("(\\w+) \\1");
StringBuilder sb = new StringBuilder(1000);
int i = 0;
for (String s : lineOfWords) { // line of words is a List<String> that has each line read in from txt file
Matcher m = p.matcher(s.toUpperCase());
// and then do something like
while (m.find()) {
// do something here
}
我试着查看m.end以查看是否可以创建新字符串,或删除匹配项目,但在阅读文档后我不确定它是如何工作的。例如,作为一个测试案例,看看它是如何工作的,我做了:
if (m.find()) {
System.out.println(s.substring(i, m.end()));
}
包含This is an example example test test test.
为什么我的输出This is
?
编辑:
如果我有一个AraryList lineOfWords从.txt文件行读取每一行,然后我创建一个新的ArrayList来保存修改后的字符串。例如
List<String> newString = new ArrayList<String>();
for (String s : lineOfWords {
s = s.replaceAll( code from Kobi here);
newString.add(s);
}
但是它不会给我新的s,而是原来的s。是因为浅层和深层复制?
答案 0 :(得分:3)
尝试类似:
s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
正则表达式比你的强一点 - 它会检查整个单词(没有部分匹配),并且可以删除任意数量的连续重复。
正则表达式捕获第一个单词:\b(\w+)\b
,然后尝试匹配该单词的空格和重复:(\s+\1)+
。最终\b
是为了避免\1
的部分匹配,如"for formatting"
。
答案 1 :(得分:1)
第一场比赛是“Th IS IS 一个例子......”,所以m.end()
指向第二个“是”的结尾。我不确定为什么你使用i
作为起始索引;请尝试m.start()
。
要改善正则表达式,请在单词前后使用\b
表示应该有单词边界:(\\b\\w+\\b)
。否则,正如你所看到的那样,你会在单词中得到匹配。