circlesport

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  49 随笔 :: 1 文章 :: 28 评论 :: 55692 阅读

2007年7月23日

语法:??,*?,+?,{n}?,{n,m}?

  涵义:简单说,后面的这个?(lazy)告诉正则引擎,它前面的表达式匹配到最短的匹配项就不用匹配下去了,如??,?本身匹配0-1个匹配项,那么??就取最短的,匹配0个项就不匹配下去了,同理,*?匹配0个,+?匹配1个,{n}?匹配n个,{n,m}?匹配n个。当用@”\w*?”匹配”abcd”时,会有五次成功匹配,每次都匹配的结果都是空字符串为什么会是5次呢,这是因为正则引擎在匹配一个表达式时是一个字符一个字符对比下去的,每成功匹配一次,就前进一下。

  判断表达式

  语法:

  1、A|B,这个是最基本的,A或者B,其实这个不能算判断

  2、(?(expression)yes-expression|no-expression),其中no-expression为可选项,意为,如果expression成立,则要求匹配yes-expression,否则要求匹配no-expression

  3、(?(group-name)yes-expressioin|no-expression),其中no-expression为可选项,意为,如果名为group-name的组匹配成功,则要求匹配yes-expression,否则要求匹配no-expression

  判断表达式还是很好理解的,唯有一点要注意:@"(?(A)A|B)"不能匹配"AA",为什么呢?要怎么样写才能匹配呢,大家先想想……

  我们应该这样写Regex: @”(?(A)AA|B)”,请注意,判断式中的内容并不会做为yes-expression或no-expression表达式的一部分。

  .net 的正则引擎工作特点

  .net的正则引擎工作方式大多数和我们“想当然”的方式一样,只是有几点要注意:

  1、.NET Framework 正则表达式引擎尽可能的匹配多的字符(贪婪)。正是由于这一点,所以,不要用@"<.*>(.*)</.*>"这样的正则式来试图找出一个HTML文档中的所有innerText。(我也正是在网上看到有人这样写正则式才决定要写《正则表达式 高级技巧》的,呵呵)

  2、.NET Framework 正则表达式引擎是回溯的正则表达式匹配器,它并入了传统的非确定性有限自动机 (NFA) 引擎(例如 Perl、Python使用的引擎)。这使其有别于更快的、但功能更有限的纯正则表达式确定性有限自动机 (DFA) 引擎。.NET Framework 正则表达式引擎尽量匹配成功,所以,当@"\w+\.(.*)\.\w+"中的.*把www. .csdn.net中的.csdn.net都匹配完了,让后面的\.\w+没得字符去匹配时,引擎会进行回溯,以得到成功的匹配。
 
  NET Framework 正则表达式引擎还包括了一组完整的语法,让程序员能够操纵回溯引擎。包括:

  “惰性”限定符:??、*?、+?、{n,m}?。这些惰性限定符指示回溯引擎首先搜索最少数目的重复。与之相反,普通的“贪婪的”限定符首先尝试匹配最大数目的重复。

  从右到左匹配。这在从右到左而非从左到右搜索的情况下十分有用,或者在从模式的右侧部分开始搜索比从模式的左侧部分开始搜索更为有效的情况下十分有用。

  3、.NET Framework 正则表达式引擎在(expression1|expression2|expression3)这样情况下,expression1总是最先得到尝试,再依次是expression2和expression3

publicstaticvoidMain()
{
strings="THINisaasp.netdeveloper.";
Regexreg=newRegex(@"(\w{2}|\w{3}|\w{4})",RegexOptions.Compiled|RegexOptions.IgnoreCase);
MatchCollectionmc=reg.Matches(s);
foreach(Matchminmc)
Console.WriteLine(m.Value);
Console.ReadLine();
}

  输出结果是: ‘TH’ ‘IN’ ‘is’ ‘as’ ‘ne’ ‘de’ ‘ve’ ‘lo’ ‘pe’

  附表

转义符 说明
一般字符 除 .$ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。
\a 与响铃(警报)\u0007 匹配。
\b 在正则表达式中,\b 表示单词边界(在 \w 和 \W 之间),不过,在 [] 字符类中,\b 表示退格符。在替换模式中,\b 始终表示退格符。
\t 与 Tab 符 \u0009 匹配。
\r 与回车符 \u000D 匹配。
\v 与垂直 Tab 符 \u000B 匹配。
\f 与换页符 \u000C 匹配。
\n 与换行符 \u000A 匹配。
\e 与 Esc 符 \u001B 匹配。
\040 将 ASCII 字符匹配为八进制数(最多三位);如果没有前导零的数字只有一位数或者与捕获组号相对应,则该数字为后向引用。例如,字符\040 表示空格。
\x20 使用十六进制表示形式(恰好两位)与 ASCII 字符匹配。
\cC 与 ASCII 控制字符匹配;例如,\cC 为 Ctrl-C。
\u0020 使用十六进制表示形式(恰好四位)与 Unicode 字符匹配。
\ 在后面带有不识别为转义符的字符时,与该字符匹配。例如,\* 与 \x2A 相同。
字符类 说明
. 匹配除 \n 以外的任何字符。如果已用 Singleline 选项做过修改,则句点字符可与任何字符匹配。
[ aeiou ] 与指定字符集中包含的任何单个字符匹配。
[^ aeiou ] 与不在指定字符集中的任何单个字符匹配。
[0-9a-fA-F] 使用连字号 (–) 允许指定连续字符范围。
\p{ name }

与 {name} 指定的命名字符类中的任何字符都匹配。支持的名称为 Unicode 组和块范围。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing。可以使用 GetUnicodeCategory 方法找到某个字符所属的 Unicode 类别。

\P{ name } 与在 {name} 中指定的组和块范围不包括的文本匹配。
\w 与任何单词字符匹配。等效于 Unicode 字符类别 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。
\W 与任何非单词字符匹配。等效于 Unicode 字符类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \W 等效于 [^a-zA-Z_0-9]。
\s 与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等效于 [ \f\n\r\t\v]。
\S 与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等效于 [^ \f\n\r\t\v]。
\d 与任何十进制数字匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \p{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [0-9]。
\D 与任何非数字匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \P{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [^0-9]。
断言 说明
>^ 指定匹配必须出现在字符串的开头或行的开头。
$ 指定匹配必须出现在以下位置:字符串结尾、字符串结尾处的 \n 之前或行的结尾。
\A 指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。
\Z 指定匹配必须出现在字符串的结尾或字符串结尾处的 \n 之前(忽略 Multiline 选项)。
\z 指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。
\G 指定匹配必须出现在上一个匹配结束的地方。与 Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。
\b 指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上,即出现在由任何非字母数字字符分隔的单词中第一个或最后一个字符上。
\B 指定匹配不得出现在 \b 边界上。
限定符 说明
* 指定零个或更多个匹配;例如 \w* 或 (abc)*。等效于 {0,}。
+ 指定一个或多个匹配;例如 \w+ 或 (abc)+。等效于 {1,}。
? 指定零个或一个匹配;例如 \w? 或 (abc)?。等效于 {0,1}。
{ n } 指定恰好 n 个匹配;例如 (pizza){2}。
{ n ,} 指定至少 n 个匹配;例如 (abc){2,}。
{ n , m } 指定至少 n 个但不多于 m 个匹配。
*? 指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。
+? 指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。
?? 指定使用零次重复(如有可能)或一次重复 (lazy ?)。
{ n }? 等效于 {n} (lazy {n})。
{ n ,}? 指定尽可能少地使用重复但至少使用 n 次 (lazy {n,})。
{ n , m }? 指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。


--完--
posted @ 2007-07-23 11:22 无极.net 阅读(431) 评论(0) 推荐(0)

摘要: 反向引用,指把匹配出来的组引用到表达式本身其它地方,比如,在匹配HTML的标记时,我们匹配出一个<a>,我们要把匹配出来的a引用出来,用来找到</a>,这个时候就要用到反向引用。   语法   a、反向引用编号的组,语法为\number   b、反向引用命名的组,语法为\k<name>   举例   a、匹配成对的HTML标签 @"<(?<tag>[^\s>]+)[^>]*>.*</\k<tag>... 阅读全文
posted @ 2007-07-23 11:15 无极.net 阅读(436) 评论(0) 推荐(0)

摘要: 正则表达式中的组是很重要的一个概念,它是我们通向高级正则应用的的桥梁。  组的概念   一个正则表达式匹配结果可以分成多个部分,这就是组(Group)的目的。能够灵活的使用组后,你会发现Regex真是很方便,也很强大。   先举个例子 public static void Main() {  string s = "2005-2-21";  Regex reg = new Regex(@"(?&l... 阅读全文
posted @ 2007-07-23 11:10 无极.net 阅读(317) 评论(0) 推荐(0)

摘要: 因为.net的基本正则语法和Perl5基本相同,所以基本语法你可以去下载一下M$的JS帮助文档,上面有详细的说明\d表示什么,{,5}表示什么,\[表示什么……,这里我只想提醒大家一点,为了避免和反向引用相冲突,在你用\nn表示八进制的ASCII码时,请在\后加0,就是说,\40在表示ASCII码时,请这样写\040。   替换   Regex类有一个静态的Replace方... 阅读全文
posted @ 2007-07-23 11:04 无极.net 阅读(752) 评论(0) 推荐(0)

摘要: 摘要:本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等。  关键字:正则表达式、元字符、字符串、匹配  1、正则表达式简介  正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取... 阅读全文
posted @ 2007-07-23 10:53 无极.net 阅读(574) 评论(0) 推荐(0)

2007年7月2日

摘要: ///<summary> ///截获定长的字符串 ///</summary> ///<paramname="source">源字符串</param> ///<paramname="length">需要截获的长度</param> ///<returns>截获后的字符串</returns> staticpu... 阅读全文
posted @ 2007-07-02 15:33 无极.net 阅读(463) 评论(1) 推荐(0)

2007年4月25日

摘要: 生成缩略图Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--12/**////<summary>3///生成缩略图4///</summary>5///<paramname="oldpath">原图片地址</par... 阅读全文
posted @ 2007-04-25 22:37 无极.net 阅读(658) 评论(4) 推荐(0)

2007年3月30日

摘要: 是用的FLASH调用数据库的数据。代码如下: <script type="text/javascript"> <!-- imgUrl1 = "http://www.moobol.com/livePic/manage/huxw/070225/083809_1.jpg"; imgText1 = ""; imgLink1 = escape("/molive/liveAction.do?... 阅读全文
posted @ 2007-03-30 16:50 无极.net 阅读(6663) 评论(4) 推荐(0)

2007年3月20日

摘要: 如何使用本教程别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多查资料,才能熟练掌握正则表达式。除了作为入门教程之外... 阅读全文
posted @ 2007-03-20 13:08 无极.net 阅读(584) 评论(2) 推荐(0)

2007年3月15日

摘要: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta htt... 阅读全文
posted @ 2007-03-15 17:45 无极.net 阅读(5358) 评论(0) 推荐(0)

点击右上角即可分享
微信分享提示