Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式回溯选项:收缩还是扩展?_Regex_Backtracking - Fatal编程技术网

Regex 正则表达式回溯选项:收缩还是扩展?

Regex 正则表达式回溯选项:收缩还是扩展?,regex,backtracking,Regex,Backtracking,到目前为止,在我对正则表达式的研究中,我得出了一个结论,即每当发生回溯时,当前“在回溯点”的代币要么尝试扩展(前提是它后面有一个惰性量词;比如,x*?最初抓取“x”的代币将尝试抓取另一个x成为“xx”),要么收缩(前提是后面跟一个贪婪的量词;x*,它最初抓取“xxx”将尝试释放一个x来抓取“xx”)。据我所知,这些动作严格取决于标记后面的量词类型 但这与regex教程本节提供的信息有些矛盾:。 作者给出了一个正在搜索的字符串示例- "1,2,3,4,5,6,7,8,9,10,11,12,13"

到目前为止,在我对正则表达式的研究中,我得出了一个结论,即每当发生回溯时,当前“在回溯点”的代币要么尝试扩展(前提是它后面有一个惰性量词;比如,x*?最初抓取“x”的代币将尝试抓取另一个x成为“xx”),要么收缩(前提是后面跟一个贪婪的量词;x*,它最初抓取“xxx”将尝试释放一个x来抓取“xx”)。据我所知,这些动作严格取决于标记后面的量词类型

但这与regex教程本节提供的信息有些矛盾:。
作者给出了一个正在搜索的字符串示例-

"1,2,3,4,5,6,7,8,9,10,11,12,13" and regex - "^([^,\r\n]*,){11}P".
他进一步指出:“如果找不到p,引擎仍然会回溯。但它只会回溯11次,而且每次
[^,\r\n]
都无法扩展到逗号之外,迫使正则表达式引擎立即返回到11次迭代中的前一次,而无需尝试其他选项。”

“expand”这个词让我很困惑。当令牌回溯时,它会在此时尝试扩展吗?正则表达式应该是这样写的:
“^([^,\r\n]*?,){11}p”,
不会出现任何问题,但现在我想知道我是否正确地理解了回溯的概念
还是不


有人能解释一下吗?

他说的是,
[^,\r\n]*
永远不会使用逗号以外的字符,逗号是分隔符


如果字符集不包含逗号,那么回溯的数量将灾难性地增加,因为它是一个重复的子模式。

在这种特殊性和详细程度上,最好先确定一个特定的正则表达式引擎,然后尝试发现它的行为。我正在研究Java中的正则表达式行为,但在这种情况下这真的很重要吗?他实际上是说,在这种特殊情况下回溯时,正则表达式引擎将无法扩展。但在这里,正则表达式只有在第一次匹配时才会扩展,回溯时会收缩。这可能看起来像分词,但实际上对我来说掌握这个概念非常重要。