多语言展示
当前在线:1667今日阅读:176今日分享:34

.NET正则表达式使用高级技巧

语法:??,*?,+?,{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和expression3publicstaticvoidMain(){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’
推荐信息