使用以下代码:
Pattern pattern = Pattern.compile("((foo) (bar)?)|((foo) (baz)?)");
Matcher matcher = pattern.matcher("foo baz");
if(matcher.find()){
for(int i=1; i<=matcher.groupCount(); i++){
System.out.println(matcher.group(i));
}
}
结果是:
foo
foo
null
null
null
null
而我希望的是:
null
null
null
foo baz
foo
baz
如何匹配第二项?
如果可能的话,我想匹配完整的“foo baz”,否则匹配“foo”
最佳答案
您的正则表达式的行为符合预期:您的输入 "foo baz"
匹配((foo) (bar)?)
—至少,"foo "
部分确实如此。一般来说,正则表达式更喜欢先定义最长模式(贪婪)(从左到右),并且 "foo "
比 "foo baz"
更匹配.
如果要确保整个表达式匹配,则需要 ^
和$
:
Pattern pattern = Pattern.compile("^((foo) (bar)?)$|^((foo) (baz)?)$");
关于java - 匹配可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953482/