正则表达式通俗 C#正则表达式整理备忘(3)
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

反向预搜索声明格式 正声明 (?<=) 负声明 (?
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