【问题标题】:Regex if line does not contain key words正则表达式如果行不包含关键字
【发布时间】:2019-05-26 02:00:55
【问题描述】:

您将如何设置表达式以发现输入字符串中不存在关键字? 关键词是:鸡蛋、培根、奶酪

功能是:

    if (!line.matches("eggs") || !line.contains("bacon")|| !line.contains("cheese") )
    {
        match=line;
    }

    return matchregex;

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我试过了: 1. if (!line.contains("eggs") || !line.contains("bacon")|| !line.contains("cheese") ) // 2. if (line.toLowerCase().matches("(.*?cheese:.*)|(.*?eggs:.*) //3.我这两天试着找例子。 //4.我注意到 if (!line.contains("eggs") ) 有效,但是如果我尝试添加更多单词,它将根本不起作用并完全忽略我的关键字。
  • 看看这个example,把代码放到一个方法中,用那个方法返回相反的结果
  • 附带说明:仅用于检查这三个单词,我不建议使用正则表达式。在这种特殊情况下,查找文本的常用字符串方法更快。
  • @Sascha 有趣,你认为原始性能是这个项目的关键因素吗? :-)

标签: java regex


【解决方案1】:

对于正则表达式,Java documentation 提供了相当不错的描述

也可以试试这个website 来试试你的模式。它可以让您快速查看它的行为方式。

公共静态布尔匹配(字符串正则表达式, CharSequence 输入)

编译给定的正则表达式并尝试匹配给定的 反对它。

对表单的这种便捷方法的调用

 Pattern.matches(regex, input);

行为方式与表达式完全相同

 Pattern.compile(regex).matcher(input).matches()

如果一个模式要被多次使用,编译一次然后 重用它会比每次调用这个方法更有效。

参数:

  • regex - 要编译的表达式
  • input - 要匹配的字符序列

返回:

  • 输入的正则表达式是否匹配

投掷:

  • PatternSyntaxException - 如果表达式的语法无效

【讨论】:

    【解决方案2】:

    匹配鸡蛋、培根或奶酪的正则表达式是:

    (eggs|bacon|cheese)
    

    您需要检测何时行不匹配,因此您可以像这样否定条件:

    if (!line.matches("(eggs|bacon|cheese)") {
        // Do something
    }
    

    这匹配整行。如果您想判断该行是否包含这些词中的任何一个,您需要进行不同的匹配——使用.* 来匹配该行的其余部分,或者使用PatternMatcher .

    我会使用:\b 来标记单词边界,以确保您只匹配 cheese 而不匹配 cheesecake

    Pattern pattern = Pattern.compile("\\b(eggs|bacon|cheese)\\b");
    Matcher matcher = pattern.matcher(line);
    if (!matcher.find()) {
        // Do something
    }
    

    或者:

    if (!line.matches(".*\\b(eggs|bacon|cheese)\\b.*")) {
        // Do something
    }
    

    您必须将反斜杠加倍才能在字符串中转义它们。

    【讨论】:

    • 嗯,这不也匹配smeggs 吗?
    • 不,对于第一个示例,整行必须完全匹配“eggs”。对于后续示例,我使用\b 表示必须有单词边界(非字母或行尾)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多