正则表达式:所有格量词中的回溯
Regular Expression: Backtracking in Possessive Quantifier
我在复习测试时注意到所有格量词实际上在 str.split()
中有效。所以我写了下面的代码:
String str = "aaaaab";
if(str.matches("a*+b"))
System.out.println("I backtrack");
else
System.out.println("Nope.");
当运行时,打印出I backtrack
。这就是为什么这令人困惑,有人告诉我所有格量词永远不会回溯,那么为什么 a*+
会放弃字符串中的 b
?
我想要的是有关所有格量词何时回溯的更详细解释。
您的示例中没有回溯。
你说的是 "any number of a
characters"。因此,引擎将收集这 5 a
个字符,然后停止;然后找到 b
。
仅此而已。
回溯意味着引擎在收集了太多的输入字符串之后必须"track back";有关示例,请参阅 here。
除此之外:您的 if 条件 returns true 当模式与输入匹配时。您认为这意味着 "it is backtracking" 的结论是不正确的:
一场比赛就是一场比赛;无论引擎是否必须回溯才能匹配(或不匹配)。换句话说:你的小测试没有告诉你任何东西(它只告诉你输入是否匹配给定的模式;句点)。
我在复习测试时注意到所有格量词实际上在 str.split()
中有效。所以我写了下面的代码:
String str = "aaaaab";
if(str.matches("a*+b"))
System.out.println("I backtrack");
else
System.out.println("Nope.");
当运行时,打印出I backtrack
。这就是为什么这令人困惑,有人告诉我所有格量词永远不会回溯,那么为什么 a*+
会放弃字符串中的 b
?
我想要的是有关所有格量词何时回溯的更详细解释。
您的示例中没有回溯。
你说的是 "any number of a
characters"。因此,引擎将收集这 5 a
个字符,然后停止;然后找到 b
。
仅此而已。
回溯意味着引擎在收集了太多的输入字符串之后必须"track back";有关示例,请参阅 here。
除此之外:您的 if 条件 returns true 当模式与输入匹配时。您认为这意味着 "it is backtracking" 的结论是不正确的:
一场比赛就是一场比赛;无论引擎是否必须回溯才能匹配(或不匹配)。换句话说:你的小测试没有告诉你任何东西(它只告诉你输入是否匹配给定的模式;句点)。