模式,Java中的匹配器,REGEX帮助

时间:2010-08-04 04:44:24

标签: java regex

我正试图从文本文件中删除重复的连续单词,有人提到我可以做这样的事情:

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。是因为浅层和深层复制?

2 个答案:

答案 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)。否则,正如你所看到的那样,你会在单词中得到匹配。