java中if条件的正则表达式

java中if条件的正则表达式,java,regex,if-statement,Java,Regex,If Statement,所以我有这个问题。。 投票后是10个a、D或M(同意、不同意,可能),然后是是是或否。如果答案是否定的,则必须有一个理由 捕获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

所以我有这个问题。。
投票后是10个a、D或M(同意、不同意,可能),然后是是是或否。如果答案是否定的,则必须有一个理由

捕获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)
    {
    }
这行吗

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

然后获取组(1,2,3)。

您可以使用非捕获组,以避免替换匹配的零件存储在捕获组中

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

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

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

POLL\s+([ADM]{10})\s+(?:(yes)|(no)\s+([a-z. ]+))
查看(当鼠标悬停在匹配项上时,您可以查看组的内容。)

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

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

组[1]
始终包含ADM部分

组[2]
如果有“是”则包含“是”,否则为空

组[3]
如果有“否”则包含“否”,否则为空

组[4]
包含“注释”,如果有一条注释为空

请尝试
POLL\s+([ADM]{10})\s+((yes | no)(\s+([a-z.]+)?)
-我们为
(yes | no)
添加了一个新组。它的数字将是3,而reason的组将是5。在
yes
之后匹配可选文本,但忽略它,我想这应该可以

编辑:

通过在
yes
之后插入美元符号
$
,如果
yes
之后有任何内容,您将阻止匹配:
POLL\s+([ADM]{10})\s+((yes$| no)(\s+([a-z.]+)?)

编辑2(响应@TristanDiaz):

我不会把我的生命押在它上面,但我担心你想要的是不可能的,至少用标准的正则表达式是不可能的。一方面,你希望
no
和后面的解释总是在一起。这意味着在正则表达式中进行连接。另一方面,您只想将
yes
no
捕获到一个组中,这需要以某种方式从后面的字符串中拆分
no
。你不能同时拥有两种方式。您必须在正则表达式之外执行某些操作(例如,捕获
no
及其后的文本,将其分成单个组,并使用正则表达式之外的常规字符串函数将其拆分),或者根据条件选择从中获取yes/no文本的捕获组。无论如何,您都需要外部代码

正则表达式有一定的表达能力,并不是所有的东西都可以在它们的帮助下表达出来。例如,像“n个A字符后跟n个B字符”或“括号嵌套正确的算术表达式”这样简单的表达式不可能使用正则表达式来表示


如果这是一项实际任务,我建议不要使用正则表达式,而是在前N个空格上拆分输入字符串,并使用普通代码分别验证每个部分。

您的问题是第三个捕获组嵌套在第二个捕获组中,因此原因将作为组2和组3的一部分捕获。 尝试将一个括号从正则表达式的末尾移动到“no”之后,即。
POLL\s+([adm]{10})\s+(是|否)\s+([a-z.]+)

如果第2组等于“是”,只要忽略与第3组匹配的任何内容,假设其中有任何内容

编辑
好的,试试这个
POLL\s+([adm]{10})\s+(yes | no)(?:(?你可以在你的正则表达式中加上一个先行条件语句

Pattern.compile("POLL\\s+([ADM]{10})\\s+((?=no)(no)\\s(.+$)|yes$)", Pattern.CASE_INSENSITIVE);
这与在“是”之后包含注释的字符串不匹配,也不会与没有注释的“否”匹配。请使用组1、3和4中的“否”和组1和组2中的“是”

**编辑**

下面的正则表达式应该可以工作,并将结果存储在正确的组中。1、2和3(如果希望“原因”不带前导空格,请使用组4)


Pattern=Pattern.compile(“POLL\\s+([ADM]{10})\\s+(no | yes$)(?:(?不要在正则表达式上浪费时间;只需阅读并解析轮询行。我必须这样做。这是一个使用正则表达式的作业。lolex有什么问题/困难?我添加了家庭作业标记:)POLL后面是10个As、Ds或Ms的组合(同意、不同意,也许),后面跟着是或否。如果答案是否定的,那么一定有一个应该遵循的理由。捕获ff:a,D,M回答是/否答案,然后是一个nosorry,但我不明白。我如何才能捕获adm组合组,是或否组,以及理由组?我尝试了youre regex。它几乎起作用了。但当它可以ptures no返回null。yes | no必须在同一组中not(yes)|(no)我使用了此解决方案。这是可行的,但如果没有后跟原因,则正则表达式不能匹配“否”。如果“否”后面没有任何内容,则类似的东西会阻止匹配吗?当“是”组捕获“否”时,它必须后跟原因。没有原因的“否”无效。例如:POST admm no//invalid它必须是POST admm no blah.y我们的正则表达式没有理由匹配no。它返回null@TristanDiaz好的,我已经更新了我的答案。我认为这应该行得通,但IRL使用if语句会容易得多。@TristanDiaz你在我的答案中尝试过正则表达式吗?它会给你分组1:a..m;分组2:no;分组3:no注释必须是这样的,例如有效的投票aadammadm yes民意测验MMMMMMMMMM否市长应该在尽量减少停电和交通方面做得更好。例如,无效(无理由回答否,ADM加起来不等于10)民意测验aaaaa dddmmmmaadd no Di kami close。民意测验AAAADDDDMM nonic