不情愿量词行为的原因??在java正则表达式中

时间:2012-03-28 16:22:24

标签: java regex reluctant-quantifiers

我知道?是一个贪婪的量词,??是不情愿的。 当我按如下方式使用时,它总是给我一个空输出?是因为它总是从左到右(首先看零发生然后匹配的发生)或另一个发生?

    Pattern pattern = Pattern.compile("a??");
    Matcher matcher = pattern.matcher("aba");
    while(matcher.find()){
        System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
    }

输出:

0[]0
1[]1
2[]2
3[]3

2 个答案:

答案 0 :(得分:3)

我不确定Java实现,但regular-expressions.info??说明了这一点:

  

使前面的项目可选。懒惰,所以可选项目在匹配中被排除在可能的情况下。由于其用途有限,此构造通常被排除在文档之外。

因此,你得到4个匹配(3个字符位置+在ent处的空字符串),并且从每个匹配中排除可选的a

答案 1 :(得分:3)

您的正则表达式可以解释如下:“尝试匹配零个字符,如果失败,请尝试匹配一个'a'字符。”

尝试匹配零个字符将始终成功,因此对于仅包含单个不情愿元素的正则表达式实际上没有任何意义。