所以我有这个问题.. 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/