4
4

1 回答 1

4

原子组后面的+量词意味着正则表达式引擎将尝试匹配组内的模式一次或多次。这与引擎只会尝试匹配模式一次的第二个表达式不同。

+后面没有惰性修饰符?,所以会贪婪匹配,即尽可能多的匹配。

分组可能是原子的,因为除了使组不被捕获外,它还可以防止在整个子表达式的每次完全匹配后进行任何回溯。

如果或一旦\n*组末尾的 未能匹配换行符,因为+引擎将开始尝试从头开始再次匹配组。如果它没有这样做,那么由于组是原子的,现有的匹配将被返回。

如果组不是原子的,引擎将回溯以尝试不同的方式来匹配刚刚成功匹配的内容,然后再次尝试匹配组的开头。

例如,如果匹配的最后三个字符是换行符,\n*它会首先放弃最后一个并尝试再次匹配组的开头。当失败时,它会给出另一个换行符并重试,依此类推。

回溯将继续到序列和(.+\n)*那里,由于与匹配的内容.和与匹配多少字符的灵活性,引擎可以通过多种方式匹配模式,然后再尝试再次匹配。+*

整个子表达式可以以多种不同的方式匹配字符串的同一部分,因此在引擎确定无法进行进一步匹配之前,可能会进行大量低效、耗时的回溯。

原子团表示意味着可以避免这种情况。

于 2013-02-02T17:09:28.023 回答