正则表达式可选捕获组?

经过几个小时的搜索,我决定问这个问题.为什么这个正则表达式:^(dog). ?(猫)?不工作,因为我认为它应该工作(抓住第一只狗和猫,如果有)?我在这里缺少什么?
dog,cat
dog,dog,dog
之所以你不能得到一个可选的猫不情愿的资格. ?它是可选的和非锚定的:发动机不被迫进行匹配,因为它可以合法地将猫视为“尾巴”. ?序列.

如果您将猫锚定在字符串的末尾,即使用^(狗). ?(猫)?$,你会得到一个匹配,虽然:

Pattern p = Pattern.compile("^(dog).+?(cat)?$");
for (String s : new String[] {"dog,cat","dog,dog"}) {
    Matcher m = p.matcher(s);
    if (m.find()) {
        System.out.println(m.group(1)+" "+m.group(2));
    }
}

打印(demo 1)

dog cat
dog cat
dog null

Do you happen to know how to deal with it in case there’s something after cat?

您可以通过构建一个比猫以外的任何东西更复杂的表达来处理它,如下所示:

^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)?

现在猫可以发生在字符串的任何地方,没有锚点(demo 2).

相关文章

jquery.validate使用攻略(表单校验) 目录 jquery.validate...
/\s+/g和/\s/g的区别 正则表达式/\s+/g...
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母...
this.optional(element)的用法 this.optional(element)是jqu...
jQuery.validate 表单动态验证 实际上jQuery.validate提供了...
自定义验证之这能输入数字(包括小数 负数 ) <script ...