在java语句中匹配列表/数组中的任何单词
我有一个在java语句中匹配列表/数组中的任何单词,java,regex,matcher,Java,Regex,Matcher,我有一个列表,如下所示 List<String> forbiddenWordList = Arrays.asList("LATE", "S/O", "SO", "W/O", "WO"); 非常感谢正则表达式。您可以这样使用: boolean containsForbiddenName = forbiddenWordList.stream() .anyMatch(forbiddenName -> name.toLowerCase() .contai
列表
,如下所示
List<String> forbiddenWordList = Arrays.asList("LATE", "S/O", "SO", "W/O", "WO");
非常感谢正则表达式。您可以这样使用:
boolean containsForbiddenName = forbiddenWordList.stream()
.anyMatch(forbiddenName -> name.toLowerCase()
.contains(forbiddenName.toLowerCase()));
对单词进行迭代(流
),如果任何单词(命名为w
)与条件匹配(包含
),则返回true
列表可以表示为一种模式:
Pattern forbiddenWordPattern
= Pattern.compile("LATE|S/O|SO|W/O|WO", 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
)有助于查找准确的单词,而不是匹配的文本。
感谢大家的帮助。更改为方法引用名称::containsanswer,不做任何解释不是很好。。。而且不起作用,因为LATE不会出现在“LATE”中,而用户说它必须找到它,它必须不区分大小写,并且它与我的一样^^即使我的方法可以避免代码冗余这也失去了使用列表的所有好处,如果用户想轻松添加数千个禁止的单词,他不想把所有的东西都加进去pattern@azro是的,但问题以“非常感谢正则表达式”结尾。是的,这不是一个简单的解决方案,请看下面我添加了一个可以自动为
String name=“Jhon Solomon”构建模式的解决方案代码>返回true
。但是我在这里期望false
,因为那里没有单词“SO”。我添加了一个模式解决方案,它允许保留列表选项来添加单词,并且不需要手动将单词添加到模式中(而不是向下投票者)-您构建模式的方法非常复杂,特别是当您已经使用收集器时。加入。无需手动添加分离器,然后移除第一个分离器。禁止字模式的整个创建过程可以替换为String.join(“|”,words)
@Hulk我不知道字符串。加入(“|”,单词),直到在上面的帖子中看到它。或者,如果出于某种原因喜欢流,请使用String name=“Jhon Solomon”代码>返回true
。但是我在这里期望false
,因为那里没有“SO”这个词。
Pattern forbiddenWordPattern
= Pattern.compile("LATE|S/O|SO|W/O|WO", Pattern.CASE_INSENSITIVE);
boolean hasForbiddenWord = forbiddenWordPattern.matcher(text).find();
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());