谢谢

解决方案 »

  1.   

    第一个没见过是(?!X)  ?
    第二个是正向预搜索,(?<X)是反向预搜索http://blog.csdn.net/believefym/archive/2007/05/31/1633369.aspx
      

  2.   

    (?:X)
    这个是非捕获组,其实这个对结果不影响的,只是说你这个括号不是分组,只是为了吧一段规则包含起来。因为保存分组需要时间和内存,给你个例子。这个。呵呵。也算是抄的吧。别的网上看的(?:(\w)\1)+
    这里有几个分组?答案是1个。就是(\w),然后\1就是对(\w)这个分组的引用。而外面的(?:)就不是分组了。但是我需要多个(\w)\1的时候,我需要引用(\w),但对外面的,不需要取这个分组。就可以取消这个分组,这个是关系到效率的问题。在海量数据检索的时候。使用非捕获组可以提高一点效率。这个我检查过,大约用非捕获组可以提高10%~20%的效率。(?>X)
    这个是原子组。我就不解释了。直接帖给你:
    原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是<<(?>正则表达式)>>。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成<<^(?>(.*?,){11})P>>。一旦第十二个字段匹配失败,引擎回溯到原子组前面的<<^>>。
      

  3.   

    原子组与防止回溯在一些特殊情况下,因为回溯会使得引擎的效率极其低下。让我们看一个例子:要匹配这样的字串,字串中的每个字段间用逗号做分隔符,第12个字段由P开头。我们容易想到这样的正则表达式<<^(.*?,){11}P>>。这个正则表达式在正常情况下工作的很好。但是在极端情况下,如果第12个字段不是由P开头,则会发生灾难性的回溯。如要搜索的字串为“1,2,3,4,5,6,7,8,9,10,11,12,13”。首先,正则表达式一直成功匹配直到第12个字符。这时,前面的正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11,”,到了下一个字符,<<P>>并不匹配“12”。所以引擎进行回溯,这时正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11”。继续下一次匹配过程,下一个正则符号为点号<<.>>,可以匹配下一个逗号“,”。然而<<,>>并不匹配字符“12”中的“1”。匹配失败,继续回溯。大家可以想象,这样的回溯组合是个非常大的数量。因此可能会造成引擎崩溃。用于阻止这样巨大的回溯有几种方案:一种简单的方案是尽可能的使匹配精确。用取反字符集代替点号。例如我们用如下正则表达式<<^([^,\r\n]*,){11}P>>,这样可以使失败回溯的次数下降到11次。另一种方案是使用原子组。原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是<<(?>正则表达式)>>。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成<<^(?>(.*?,){11})P>>。一旦第十二个字段匹配失败,引擎回溯到原子组前面的<<^>>。