Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将特定字符串替换为另一个-string#replaceAll()_Java_Regex_Parsing_Replaceall - Fatal编程技术网

Java 将特定字符串替换为另一个-string#replaceAll()

Java 将特定字符串替换为另一个-string#replaceAll(),java,regex,parsing,replaceall,Java,Regex,Parsing,Replaceall,实际上,我正在开发一个解析器,我被困在一个方法上 我需要清理一些句子中的特定单词,意思是用空格或null字符替换这些单词。 现在,我想到了以下代码: private void clean(String sentence) { try { FileInputStream fis = new FileInputStream( ConfigHandler.getDefault(DictionaryType.CLEANING).getDiction

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

我需要清理一些句子中的特定单词,意思是用空格或
null
字符替换这些单词。 现在,我想到了以下代码:

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);

} 
private void clean(字符串语句)
{
试一试{
FileInputStream fis=新的FileInputStream(
ConfigHandler.getDefault(DictionaryType.CLEANING).getDictionaryFile());
BufferedReader bis=新的BufferedReader(新的InputStreamReader(fis));
字符串读取;
List wordList=new ArrayList();
而((read=bis.readLine())!=null){
添加(读);
}
}
捕获(IOE异常){
e、 printStackTrace();
}
for(字符串s:wordList){
if(StringUtils.containsIgnoreCase(句子,s)){//这来自ApacheLang
句子=句子.replaceAll((?i)+s+“\\b”,”);
}
}
清除列表。添加(句子);
} 
但是当我查看输出时,我得到了我的
句子中所有出现的要替换的单词都被一个空格替换了

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


提前谢谢

代码中有两个问题:

  • 字符串前面缺少
    \b
  • 如果文件中的任何单词具有特殊字符,您将遇到问题
要解决此问题,请按如下方式构造正则表达式:

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


语句.replaceAll((?i)\\b“+s+”\\b“,”)-您省略了前面的
\b
单词边界。我尝试了您的两个解决方案,但没有一个给出正确的输出。完整的正则表达式是
/\b(my\u word)\b/gi
。我想我的代码中唯一缺少的是
/g
部分,但我不知道它是否是隐式的。@TimmyMdfck你是在寻找
myword
中用括号括起来的,例如
“brown”
“Quick(brown)fox”
?上面的解决方案假设对单词的搜索是逐字逐句的,包括所有特殊字符,并将它们视为非特殊字符。实际上,我在*.dat文件中得到了一个法语单词列表,在*.txt文件中得到了整个文本。我的解析器将获得所有非疑问句,并将它们粘贴到另一个txt文件中。之后,将在输出文件上使用clean方法擦除dat文件中存在的所有字。这就是我的问题。我尝试使用一个regexp解释器(这里是包含所有内容的链接:),它就像一个符咒。我不明白我错在哪里:(@TimmyMdfck)您是按照代码显示的方式使用循环,还是将字符串与
连接起来?“
并用作单个表达式?regex101中的正则表达式使用圆括号作为元字符。这意味着您应该删除
\\Q
\\E
,而不是使用
模式。quote
,因为您的单词列表需要解释为正则表达式。目前,我正在使用循环执行此操作,但我正在考虑执行此操作与链接中的方式相同。
sentence = sentence.replaceAll("(?i)\\b" + Pattern.quote(s) + "\\b", " ");