您现在的位置是:首页 >

正则表达式通俗 C#正则表达式整理备忘(3)

火烧 2023-01-02 01:18:44 1112
C#正则表达式整理备忘 3    回溯与非回溯  使用 ? gt … 方式进行非回溯声明 由于正则表达式引擎的贪婪特性 导致它在某些情况下 将进行回溯以获得匹配 请看下面的示例   Code   tr

C#正则表达式整理备忘(3)  

  ( )回溯与非回溯

  使用 (?>…) 方式进行非回溯声明 由于正则表达式引擎的贪婪特性 导致它在某些情况下 将进行回溯以获得匹配 请看下面的示例

  Code  string x = Live for nothing die for something ;  Regex r = new Regex(@ *thing );  if (r IsMatch(x))   {    Console WriteLine( match: + r Match(x) Value);//输出 Live for nothing    }  Regex r = new Regex(@ (?> *)thing );  if (r IsMatch(x))//不匹配   {    Console WriteLine( match: + r Match(x) Value);   }  //在r 中 * 由于其贪婪特性 将一直匹配到字符串的最后 随后匹配 thing 但在匹配 时失败 此时引擎将回溯 并在 thing 处匹配成功

  在r 中 由于强制非回溯 所以整个表达式匹配失败

  ( )正向预搜索 反向预搜索

  正向预搜索声明格式 正声明 (?=…) 负声明 (?! ) 声明本身不作为最终匹配结果的一部分 请看下面的示例

  Code  string x = used free ;  Regex r = new Regex(@ d{ }(?= used) );  if (r Matches(x) Count== )   {    Console WriteLine( r match: + r Match(x) Value);//输出    }  Regex r = new Regex(@ d{ }(?! used) );  if (r Matches(x) Count== )   {    Console WriteLine( r match: + r Match(x) Value); //输出    }  //r 中的正声明表示必须保证在四位数字的后面必须紧跟着 used r 中的负声明表示四位数字之后不能跟有 used

正则表达式通俗 C#正则表达式整理备忘(3)

  反向预搜索声明格式 正声明 (?<=) 负声明 (?

  string x = used: free: ;  Regex r = new Regex(@ (?<=used:)d{ } );  if (r Matches(x) Count== )   {    Console WriteLine( r match: + r Match(x) Value);//输出    }  Regex r = new Regex(@ (?  if (r Matches(x) Count== )   {    Console WriteLine( r match: + r Match(x) Value);//输出    }  //r 中的反向正声明表示在 位数字之前必须紧跟着 used: r 中的反向负声明表示在 位数字之前必须紧跟着除 used: 之外的字符串

  ( )十六进制字符范围

  正则表达式中 可以使用 xXX 和 uXXXX 表示一个字符( X 表示一个十六进制数)形式字符范围

  xXX 编号在 到 范围的字符 比如 空格可以使用 x 表示

  uXXXX 任何字符可以使用 u 再加上其编号的 位十六进制数表示 比如 汉字可以使用 [u e u fa ] 表示

  ( )对[ ]的比较完备的匹配

  下面是一个比较综合的示例 对于匹配[ ] 需要特殊考虑的地方包括

  * 合法 合法 合法 合法

  *空字符串不合法 仅小数点不合法 大于 不合法

  *数值是可带后缀的 如 f 表示该值为一个float类型(未考虑)

  Code  Regex r = new Regex(@ ^+? *(?: ( *)?|(d{ }(?= d)|d{ }(?=($| $)))( d*)?)$ );  string x = ;  while (true)  {   x = Console ReadLine();   if (x != exit )   {    if (r IsMatch(x))    {     Console WriteLine(x + succeed! );    }  else    {     Console WriteLine(x + failed! );    }   }  else   {    break;   }  }

  ( )精确匹配有时候是困难的

lishixinzhi/Article/program/net/201311/15445  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码