优化段落中的单词查找

时间:2018-07-17 01:21:55

标签: java regex string parsing matcher

我正在搜索段落中的单词,但要花较长的时间才能找到段落。因此,我想在段落中找到之后删除这些词,以缩短我必须经历的词数。或者,如果有更好的方法可以提高效率,那就告诉我!

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}}中找到单词并删除它们,以期使上述代码更快。

2 个答案:

答案 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”