用另一个替换特定字符串 - String#replaceAll()

Posted

技术标签:

【中文标题】用另一个替换特定字符串 - String#replaceAll()【英文标题】:Replace specific string by another - String#replaceAll() 【发布时间】:2016-06-23 16:43:51 【问题描述】:

我实际上正在开发一个解析器,但我被困在一个方法上。

我需要清理某些句子中的具体词,这意味着用空格或nullcharacter 替换这些词。 现在,我想出了这个代码:

private void clean(String sentence)

    try 
        FileInputStream fis = new FileInputStream(
                ConfigHandler.getDefault(DictionaryType.CLEANING).getDictionaryFile());
        BufferedReader bis = new BufferedReader(new InputStreamReader(fis));
        String read;
        List<String> wordList = new ArrayList<String>();

        while ((read = bis.readLine()) != null) 
            wordList.add(read);
        
    
    catch (IOException e) 
        e.printStackTrace();
    

    for (String s : wordList) 
        if (StringUtils.containsIgnoreCase(sentence, s))  // this comes from Apache Lang
            sentence = sentence.replaceAll("(?i)" + s + "\\b", " ");
        
    

    cleanedList.add(sentence);

 

但是当我查看输出时,我将sentence 中所有出现的单词都替换为空格。

有人可以帮我只替换我句子中要替换的确切单词吗?

提前致谢!

【问题讨论】:

sentence.replaceAll("(?i)\\b" + s + "\\b", " "); - 您省略了前导 \b 字边界。 【参考方案1】:

你的代码有两个问题:

您在字符串之前缺少\b 如果文件中的任何单词包含特殊字符,您将遇到问题

要解决此问题,请按如下方式构建您的正则表达式:

sentence = sentence.replaceAll("(?i)\\b\\Q" + s + "\\E\\b", " ");

sentence = sentence.replaceAll("(?i)\\b" + Pattern.quote(s) + "\\b", " ");

【讨论】:

我尝试了你的 2 个解决方案,但没有一个给我正确的输出。完整的正则表达式是/\b(my_word)\b/gi。我认为我的代码中唯一缺少的是/gpart,但我不知道它是否是隐式的。 @TimmyMdfck 您是否在寻找 myword 字面上用括号括起来,例如"(brown)""Quick (brown) fox"?上面的解决方案假定单词的搜索是逐字逐句的,包括所有特殊字符,并将它们视为非特殊字符。 实际上,我在 *.dat 文件中获得了法语单词列表,在 *.txt 文件中获得了整个文本。我的解析器将获取所有不是问题的句子并将它们粘贴到另一个 txt 文件中。之后,将在输出文件上使用 clean 方法来擦除 dat 文件中存在的所有单词。还有我的问题。我尝试了一个正则表达式解释器(这里是所有内容的链接:regex101.com/r/cU5lC2/507),它就像一个魅力。我不明白我错在哪里:( @TimmyMdfck 您是按照代码显示的方式使用循环,还是将字符串与"|" 连接起来并用作单个表达式?来自 regex101 的正则表达式使用括​​号作为元字符。这意味着您应该删除\\Q\\E,而不是使用Pattern.quote,因为您的单词列表需要解释为正则表达式。 目前,我正在使用循环执行此操作,但我正在考虑以与链接中相同的方式执行此操作。

以上是关于用另一个替换特定字符串 - String#replaceAll()的主要内容,如果未能解决你的问题,请参考以下文章

re.sub

用另一个字符串替换一个字符串的一部分

用另一个字符替换字符串中的某些字符

7替换

7替换

为啥我们在尝试用另一个字符串替换它时使用带有“\”的@ [重复]