10

我正在努力在正则表达式方面做得更好。我很难理解是什么(?> expression )意思。我在哪里可以找到有关非回溯子表达式的更多信息?这个链接的描述说:

贪心子表达式,也称为非回溯子表达式。这仅匹配一次,然后不参与回溯。

这个其他链接: http: //msdn.microsoft.com/en-us/library/bs2twtah (v=vs.71).aspx也有非回溯子表达式的定义,但我仍然很难理解它是什么意味着加上我想不出一个我将使用的例子(?>exp)

4

3 回答 3

11

与往常一样,regular-expressions.info是一个不错的起点。

如果您想确保曾经匹配的任何内容都将保留在匹配中,请使用原子组。

例如,要匹配一些可能由空格分隔或不由空格分隔的“单词”,然后是冒号,用户尝试了正则表达式:

(?:[A-Za-z0-9_.&,-]+\s*)+:

有比赛的时候,一切都很好。但是如果没有,他的 PC 会因为灾难性的回溯而在 100% 的 CPU 负载下变得无响应,因为正则表达式引擎会徒劳地尝试找到允许以下冒号匹配的单词的匹配组合。这当然是不可能的。

通过使用原子组,可以避免这种情况:

(?>[A-Za-z0-9_.&,-]+\s*)+:

现在任何匹配的东西都保持匹配 - 没有回溯,因此失败时间很快。

我最近遇到的另一个很好的例子:

如果您想匹配所有后面没有 ASCII 字母的数字,您可能需要使用 regex \d+(?![A-Za-z])。但是,这会因输入失败而失败,123a因为正则表达式引擎会很高兴地12通过回溯返回匹配项,直到后面的字符不再是字母。如果您使用(?>\d+)(?![A-Za-z]),则不会发生这种情况。(当然,\d+(?![\dA-Za-z])也可以)

于 2012-07-24T13:54:00.547 回答
8

正则表达式教程在这里有一个页面:http ://www.regular-expressions.info/atomic.html

基本上它所做的是丢弃回溯信息,这意味着a(?>bc|b)c匹配abcc但不匹配abc

它与第二个字符串不匹配的原因是它找到了与 的匹配项,并丢弃了有关交替bc的回溯信息。bc|b它基本上忘记了|b它的一部分。因此,c后面没有bc,匹配失败。

使用原子组最有用的方法是优化慢正则表达式。您可以在上述页面上找到更多信息。

于 2012-07-24T13:54:17.060 回答
1

阅读所有格量词 [a-z]*+使回溯引擎只记住与之前所有匹配的步骤不匹配的上一步。

当可能有很多可接受的步骤时,这很有用,如果每个步骤都存储用于任何可能的回溯回归,它们会占用内存。

占有量词是原子团的简写。

于 2012-07-24T13:55:04.623 回答