【问题标题】:Removing punctuation is not working in Java with string replacement使用字符串替换在 Java 中删除标点符号不起作用
【发布时间】:2014-06-06 15:15:07
【问题描述】:

所以,我要做的是从 8 个单独的字典单词列表中编译一个没有重复的单词列表。有些词典中有标点符号来分隔单词。以下是我所拥有的与标点符号删除有关的内容。我已经尝试了几种不同的解决方案,这些解决方案是关于正则表达式的堆栈溢出,以及我在代码中保留的解决方案。出于某种原因,他们都没有从源字典中删除标点符号。有人能告诉我我在这里做错了什么以及如何解决吗?我不知所措,让同事检查了一下,他说这应该也可以。

int i = 1;
boolean checker = true;
Scanner inputWords;
PrintWriter writer = new PrintWriter(
        "/home/htarbox/Desktop/fullDictionary.txt");
String comparison, punctReplacer;

ArrayList<String> compilation = new ArrayList<String>();



while (i <9)
{
inputWords = new Scanner(new File("/home/htarbox/Desktop/"+i+".txt"));
    while(inputWords.hasNext())
    {
        punctReplacer = inputWords.next();
        punctReplacer.replaceAll("[;.:\"()!?\\t\\n]", "");
        punctReplacer.replaceAll(",", "");
        punctReplacer.replaceAll("\u201C", "");
        punctReplacer.replaceAll("\u201D", "");
        punctReplacer.replaceAll("’", "'");

        System.out.println(punctReplacer);
        compilation.add(punctReplacer);
    }
    }
inputWords.close();
}
i = 0;

【问题讨论】:

  • 字符串是不可变的。阅读您使用的方法的 javadoc。
  • 我知道字符串是不可变的,但是根据我的理解,替换函数应该重新创建整个字符串。
  • 你必须这样做:punctReplacer = punctReplacer.replaceAll(...);,因为函数返回一个新字符串。
  • 你认为重新创建字符串意味着什么?你认为不可变意味着什么?阅读 javadoc。
  • 感谢 MicSim!成功了。

标签: java string arraylist replaceall


【解决方案1】:

线

punctReplacer.replaceAll(",", "");

用你的替换返回一个新的String(你忽略了)。它修改现有的String。因此,您需要:

punctReplacer = punctReplacer.replaceAll(",", "");

Strings 是不可变的。一旦创建,您就无法更改它们,任何String 操作方法都会返回一个新的String

【讨论】:

  • 明白了。我的误解是我认为该方法的工作原理类似于数学 += 并自动用新字符串替换该字符串,而不是我必须分配它。非常感谢!
【解决方案2】:

由于字符串是不可变的,因此您必须重置变量:

punctReplacer = punctReplacer.replaceAll("[;.:\"()!?\\t\\n]", "");

(顺便说一句,不可变意味着一旦设置了值就无法更改,因此使用 String 时,如果要更改变量,则始终必须重置变量)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多