问问题
161 次
1 回答
4
原子组后面的+
量词意味着正则表达式引擎将尝试匹配组内的模式一次或多次。这与引擎只会尝试匹配模式一次的第二个表达式不同。
+
后面没有惰性修饰符?
,所以会贪婪匹配,即尽可能多的匹配。
分组可能是原子的,因为除了使组不被捕获外,它还可以防止在整个子表达式的每次完全匹配后进行任何回溯。
如果或一旦\n*
组末尾的 未能匹配换行符,因为+
引擎将开始尝试从头开始再次匹配组。如果它没有这样做,那么由于组是原子的,现有的匹配将被返回。
如果组不是原子的,引擎将回溯以尝试不同的方式来匹配刚刚成功匹配的内容,然后再次尝试匹配组的开头。
例如,如果匹配的最后三个字符是换行符,\n*
它会首先放弃最后一个并尝试再次匹配组的开头。当失败时,它会给出另一个换行符并重试,依此类推。
回溯将继续到序列和(.+\n)*
那里,由于与匹配的内容.
和与匹配多少字符的灵活性,引擎可以通过多种方式匹配模式,然后再尝试再次匹配。+
*
整个子表达式可以以多种不同的方式匹配字符串的同一部分,因此在引擎确定无法进行进一步匹配之前,可能会进行大量低效、耗时的回溯。
原子团表示意味着可以避免这种情况。
于 2013-02-02T17:09:28.023 回答