我正在搜索段落中的单词,但要花较长的时间才能找到段落。因此,我想在段落中找到之后删除这些词,以缩短我必须经历的词数。或者,如果有更好的方法可以提高效率,那就告诉我!
List<String> list = new ArrayList<>();
for (String word : wordList) {
String regex = ".*\\b" + Pattern.quote(word) + "\\b.*";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(paragraph);
if (m.find()) {
System.out.println("Found: " + word);
list.add(word);
}
}
例如,假设我的wordList
具有以下值"apple","hungry","pie"
我的paragraph
是"I ate an apple, but I am still hungry, so I will eat pie"
我想在wordList
的{{1}}中找到单词并删除它们,以期使上述代码更快。
答案 0 :(得分:1)
您可以使用
String paragraph = "I ate an apple, but I am still hungry, so I will eat pie";
List<String> wordList = Arrays.asList("apple","hungry","pie");
Pattern p = Pattern.compile("\\b(?:" + String.join("|", wordList) + ")\\b");
Matcher m = p.matcher(paragraph);
if (m.find()) { // To find all matches, replace "if" with "while"
System.out.println("Found " + m.group()); // => Found apple
}
请参见Java demo。
正则表达式看起来像\b(?:word1|word2|wordN)\b
并将匹配:
\b
-单词边界(?:word1|word2|wordN)
-非捕获组内的任何替代方案\b
-单词边界由于您说单词中的字符只能是大写字母,数字和带斜杠的连字符,因此它们都不需要转义,因此Pattern.quote
在这里并不重要。另外,由于斜杠和连字符永远不会出现在字符串的开头/结尾,因此您不会遇到通常由\b
字边界引起的问题。否则,将第一个"\\b"
替换为"(?<!\\w)"
,最后一个替换为"(?!\\w)"
。
答案 1 :(得分:-1)
我不太确定这是您要的内容,但是Java在字符串上有针对此类事物的内置函数。
for (String word : wordList) {
paragraph = paragraph.replaceAll(word,"");
}
请确保在您的单词中包含一个空格,以免留下双倍空格。示例以“ foo”代替“ foo”