正则表达式:占有量词的回溯

时间:2017-02-13 15:41:23

标签: java regex string quantifiers

我正在审查测试,发现占有量词实际上在str.split()中有效。所以我写了下面的代码:

String str = "aaaaab";

if(str.matches("a*+b"))
    System.out.println("I backtrack");
else
    System.out.println("Nope.");

运行时,会打印出I backtrack。这就是为什么这令人困惑,我被告知占有量词从不回溯,那么为什么a*+会放弃字符串中的b

我想要的是对占有量量化器回溯的更详细解释。

1 个答案:

答案 0 :(得分:2)

您的示例中没有回溯。

您说"任意数量的a字符"。因此,引擎将收集这5个a个字符,然后停止;然后找到b

这就是全部。

回溯意味着发动机必须追踪"收集输入字符串太多之后;有关此示例,请参阅here

除此之外:当模式与输入匹配时,if条件返回 true 。你的结论是,这意味着"它是回溯"不正确:

比赛是一场比赛;无论引擎是否必须回溯才能匹配(或不匹配)。换句话说:你的小测试并没有告诉你任何事情(它只告诉你输入是否符合给定的模式;句点)。