用另一个替换特定字符串 - String#replaceAll()
Posted
技术标签:
【中文标题】用另一个替换特定字符串 - String#replaceAll()【英文标题】:Replace specific string by another - String#replaceAll() 【发布时间】:2016-06-23 16:43:51 【问题描述】:我实际上正在开发一个解析器,但我被困在一个方法上。
我需要清理某些句子中的具体词,这意味着用空格或null
character 替换这些词。
现在,我想出了这个代码:
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
。我认为我的代码中唯一缺少的是/g
part,但我不知道它是否是隐式的。
@TimmyMdfck 您是否在寻找 myword
字面上用括号括起来,例如"(brown)"
在"Quick (brown) fox"
?上面的解决方案假定单词的搜索是逐字逐句的,包括所有特殊字符,并将它们视为非特殊字符。
实际上,我在 *.dat 文件中获得了法语单词列表,在 *.txt 文件中获得了整个文本。我的解析器将获取所有不是问题的句子并将它们粘贴到另一个 txt 文件中。之后,将在输出文件上使用 clean 方法来擦除 dat 文件中存在的所有单词。还有我的问题。我尝试了一个正则表达式解释器(这里是所有内容的链接:regex101.com/r/cU5lC2/507),它就像一个魅力。我不明白我错在哪里:(
@TimmyMdfck 您是按照代码显示的方式使用循环,还是将字符串与"|"
连接起来并用作单个表达式?来自 regex101 的正则表达式使用括号作为元字符。这意味着您应该删除\\Q
和\\E
,而不是使用Pattern.quote
,因为您的单词列表需要解释为正则表达式。
目前,我正在使用循环执行此操作,但我正在考虑以与链接中相同的方式执行此操作。以上是关于用另一个替换特定字符串 - String#replaceAll()的主要内容,如果未能解决你的问题,请参考以下文章