java - 匹配可选组

标签 java regex

使用以下代码:

    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/

相关文章:

java - Hibernate @ManyToMany 与复合键的映射

java - 将替换正则表达式转换为 java 算法

java - 如何在 Java 中编写这个正则表达式(单词后跟数字)?

regex - Bash 在行号和模式之间获取行

java - 从父类(super class)调用子类变量

java - 如何从 ArrayList 交换两个子列表?

java - 所有字段都需要添加@Element注解吗?

java - 解码意外元素错误

python - Django:如何读取嵌套的 url 正则表达式

javascript - 如何用html标签替换匹配模式?