Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java语句中匹配列表/数组中的任何单词_Java_Regex_Matcher - Fatal编程技术网

在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();
  • 将列表转换为带有|分隔符的字符串

    String listDelimited=String.join(“|”,禁止字列表)

  • 创建正则表达式

    句型禁止句型 =Pattern.compile(listDelimited,Pattern.CASE不区分大小写)

  • 测试你的文本

    boolean HasBankedenWord=BankedenWordPattern.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());