匹配Sentence java中List / Array的任何单词

时间:2017-07-06 11:59:52

标签: java regex matcher

我有List这样的词,如下所示

List<String> forbiddenWordList = Arrays.asList("LATE", "S/O", "SO", "W/O", "WO");

我如何理解String包含List中的任何一个词。像....

String name1 = "Adam Smith";      // false (not found)
String name2 = "Late H Milton";   // true  (found Late)
String name3 = "S/O Furi Kerman"; // true  (found S/O)
String name4 = "Conl Faruk";      // false (not found)
String name5 = "Furi Kerman WO";  // true  (found WO)

正则表达非常感谢。

5 个答案:

答案 0 :(得分:8)

$query

答案 1 :(得分:3)

  1. 将列表转换为带有|的字符串定界符

    String listDelimited = String.join(“|”,forbiddenWordList)

  2. 创建正则表达式

    模式forbiddenWordPattern         = Pattern.compile(listDelimited,Pattern.CASE_INSENSITIVE);

  3. 测试您的文字

    boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();

  4. (类似于@Maurice Perry的回答)

答案 2 :(得分:2)

您可以这样使用:

对字词的迭代stream)如果任何字词(名为w)与条件(contains)匹配,则返回true

public static boolean isForbidden(String word, List<String> words) {
     return words.stream().anyMatch(w -> (word.toLowerCase().contains(w.toLowerCase())));
}

使用正则表达式,它将从List

构建模式本身
public static boolean isForbidden1(String word, List<String> words) {
     String forbiddenWordPattern = String.join("|", words);

     return Pattern.compile(forbiddenWordPattern, Pattern.CASE_INSENSITIVE)
                   .matcher(word)
                   .find();
 }

答案 3 :(得分:2)

列表可以表示为模式:

Pattern forbiddenWordPattern
        = Pattern.compile("LATE|S/O|SO|W/O|WO", Pattern.CASE_INSENSITIVE);

要测试文本中是否存在单词,您可以执行以下操作:

boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();

答案 4 :(得分:0)

最后,我自己帮助了所有人......

    String regex = String.join("|", forbiddenWordList.stream().map(word -> "\\b" + word + "\\b").collect(Collectors.toList()));
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    System.out.println(pattern.matcher(name).find());

单词边界(\\b)有助于找到确切的单词,而不是匹配的文本。 谢谢大家的帮助。