首页 > 代码库 > 正则表达式中-分组构造

正则表达式中-分组构造

分组构造

捕获或非捕获

匹配的子表达式

捕获

命名匹配的子表达式

捕获

平衡组定义

捕获

非捕获组

非捕获

组选项

非捕获

零宽度正预测先行断言

非捕获

零宽度负预测先行断言

非捕获

零宽度正回顾后发断言

非捕获

零宽度负回顾后发断言

非捕获

非回溯子表达式

非捕获

 

表4.常用分组语法
分类代码/语法说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?‘name‘exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

 

非回溯子表达式
 
以下分组构造表示非回溯子表达式(也称为一个“贪婪”子表达式):

(?> Subexpression — 子表达式 )

其中子表达式为任何正则表达式模式。

通常,如果正则表达式包含一个可选或可替代匹配模式并且备选不成功的话,正则表达式引擎可以在多个方向上分支以将输入的字符串与某种模式进行匹配。 如果未找到使用第一个分支的匹配项,则正则表达式引擎可以备份或回溯到使用第一个匹配项的点并尝试使用第二个分支的匹配项。 此过程可继续进行,直到尝试所有分支。

(?> 子表达式 ) 语言构造禁用回溯。 正则表达式引擎将在输入字符串中匹配尽可能多的字符。 在没有任何进一步匹配可用时,它将不回溯以尝试备用模式匹配。 (也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配;子表达式不会尝试与基于该子表达式的字符串和任何该子表达式之后的子表达式匹配。)

如果你知道回溯不会成功,则建议使用此选项。 防止正则表达式引擎执行不需要的搜索可以提高性能。

下面的示例阐释非回溯子表达式如何修改模式匹配的结果。 回溯正则表达式成功匹配一系列重复字符,在字边界上其后为相同字符,但非回溯正则表达式不会匹配。

 

using System;using System.Text.RegularExpressions;public class Example{   public static void Main()   {      string[] inputs = { "cccd.", "aaad", "aaaa" };      string back = @"(\w)\1+.\b";      string noback = @"(?>(\w)\1+).\b";      foreach (string input in inputs)      {         Match match1 = Regex.Match(input, back);         Match match2 = Regex.Match(input, noback);         Console.WriteLine("{0}: ", input);         Console.Write("   Backtracking : ");         if (match1.Success)            Console.WriteLine(match1.Value);         else            Console.WriteLine("No match");         Console.Write("   Nonbacktracking: ");         if (match2.Success)            Console.WriteLine(match2.Value);         else            Console.WriteLine("No match");      }   }}// The example displays the following output://    cccd.://       Backtracking : cccd//       Nonbacktracking: cccd//    aaad://       Backtracking : aaad//       Nonbacktracking: aaad//    aaaa://       Backtracking : aaaa//       Nonbacktracking: No match

 

正则表达式中-分组构造