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