java - java中if条件的正则表达式

标签 java regex if-statement

所以我有这个问题.. POLL 后接 10 个 A、D 或 Ms(同意、不同意,也许)的组合,然后是是或否。如果答案是否定的,则必须有一个理由。

捕获 ff:

  • A、D、M 答案
  • 是/否答案
  • [“否”后面的原因]

//不区分大小写

我想到了这个正则表达式

 POLL\s+([ADM]{10})\s+(yes|no\s+([a-z. ]+))

字符串是:POLL admaaadddm no no comment

输出为:

combination --> admaaadddm
yes or no --> no no comment  //this should be fix, it must capture no only
reason --> no comment

我的代码:

    String message = "POLL admaaadddm no no comment";

    Pattern pattern = Pattern.compile("POLL\\s+([ADM]{10})\\s+(yes|no\\s+([a-z. ]+))"
            ,Pattern.CASE_INSENSITIVE);


    Matcher m = pattern.matcher(message);

    try
    {
        if (m.matches())
        {

            String combination = m.group(1);
            String yesno = m.group(2);
            String reason = m.group(3);

            System.out.println(combination);
            System.out.println(yesno);
            System.out.println(reason);

        }
    }
    catch (NullPointerException e)
    {
    }

最佳答案

您可以使用非捕获组来避免将替换匹配的部分存储在捕获组中。

(?:...) 非捕获组。

 POLL\s+([ADM]{10})\s+(?:yes|(no)\s+([a-z. ]+))

更新

那么我认为你需要这样做:

POLL\s+([ADM]{10})\s+(?:(yes)|(no)\s+([a-z. ]+))

查看here on Regexr (当鼠标悬停在比赛上时,您可以看到组的内容。)

问题是,您现在有 4 个捕获组。在 java 中你无法避免这种情况,因为交替中的组是不同的。

因此,您需要检查 group[2]group[3] 是否有效。如果group[3],则还有一个带有注释的group[4]

group[1] 始终包含 ADM 部分

group[2] 如果有“yes”则包含“yes”,否则为 NULL

group[3] 如果有“no”则包含“no”,否则为 NULL

group[4] 包含“注释”(如果有则为 NULL)

关于java - java中if条件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484567/

相关文章:

java - 重构java中的if语句

java - 获取两个变量的百分比

java - 如何通过Selenium阻止chrome中的弹出窗口

java - 将具有多个对象的 JSON 字符串转换为类实例

java |通过正则表达式传递插入符号

sql - ORACLE CONNECT BY LEVEL 产生重复行

azure - ADF 获取属性 "status": "Succeeded" and IF for validation

java - 当我尝试为 String 类的对象设置名称时,为什么下面的 Java 代码显示错误?

Java-使用for循环将字母表放入数组中

java - 如何使用 Java 将 bash 脚本分解为最小的工作 block