匹配句子 java 中 List/Array 的任意单词
Match any word of a List/Array in a Sentence java
我有一个 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)
非常感谢正则表达式。
boolean containsForbiddenName = forbiddenWordList.stream()
.anyMatch(forbiddenName -> name.toLowerCase()
.contains(forbiddenName.toLowerCase()));
你可以这样使用:
迭代单词 (stream
) 和 returns 如果任何单词(名为 w
)与条件匹配(contains
)
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();
}
列表可以表示为模式:
Pattern forbiddenWordPattern
= Pattern.compile("LATE|S/O|SO|W/O|WO", Pattern.CASE_INSENSITIVE);
要测试文本中某个词的存在,您可以这样做:
boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();
将列表转换为带有 | 的字符串分隔符
String listDelimited = String.join("|", forbiddenWordList )
创建正则表达式
模式 forbiddenWordPattern
= Pattern.compile(listDelimited , Pattern.CASE_INSENSITIVE);
测试你的文字
boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();
(类似于@Maurice Perry 的回答)
在大家的帮助下,我终于找到了自己的解决方案....
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
) 有助于找到准确的单词,而不是匹配的文本。
谢谢大家的帮助。
我有一个 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)
非常感谢正则表达式。
boolean containsForbiddenName = forbiddenWordList.stream()
.anyMatch(forbiddenName -> name.toLowerCase()
.contains(forbiddenName.toLowerCase()));
你可以这样使用:
迭代单词 (stream
) 和 returns 如果任何单词(名为 w
)与条件匹配(contains
)
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();
}
列表可以表示为模式:
Pattern forbiddenWordPattern
= Pattern.compile("LATE|S/O|SO|W/O|WO", Pattern.CASE_INSENSITIVE);
要测试文本中某个词的存在,您可以这样做:
boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();
将列表转换为带有 | 的字符串分隔符
String listDelimited = String.join("|", forbiddenWordList )
创建正则表达式
模式 forbiddenWordPattern = Pattern.compile(listDelimited , Pattern.CASE_INSENSITIVE);
测试你的文字
boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();
(类似于@Maurice Perry 的回答)
在大家的帮助下,我终于找到了自己的解决方案....
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
) 有助于找到准确的单词,而不是匹配的文本。
谢谢大家的帮助。