资源描述:
《详解c#正则表达式高级技巧》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、详解C#正则表达式高级技巧则表达式(RegularExpression,abbr.regex)功能强大,能够用于在一大串字符里找到所需信息。它利用约定俗成的字符结构表达式来发生作用。不幸的是,简单的正则表达式对于一些高级运用,功能远远不够。若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式。本文为您介绍正则表达式的高级技巧。我们筛选出了八个常用的概念,并配上实例解析,每个例子都是满足某种复杂要求的简单写法。如果你对正则的基本概念尚缺乏了解,请先阅读这篇文章,或者这个教程,或者维基条目。这里的正则语法适用于PHP,与Perl兼容。1.贪婪/懒惰所有能多次限定的正则运算符都是贪
2、婪的。他们尽可能多地匹配目标字符串,也就是说匹配结果会尽可能地长。不幸的是,这种做法并不总是我们想要的。因此,我们添加“懒惰”限定符来解决问题。在各个贪婪运算符后添加“?”能让表达式只匹配尽可能短的长度。另外,修改器“U”也能惰化能多次限定的运算符。理解贪婪与懒惰的区别是运用高级正则表达式的基础。贪婪操作符操作符*匹配之前的表达式零次或零次以上。它是一个贪婪操作符。请看下面的例子:preg_match('/
.*
/','
这是一个标题。
这是另一个。
',$matches);句点(.)能代表除换行符外的任意字符。上面的正则表达式匹配h
3、1标签以及标签内的所有内容。它用句点(.)和星号(*)来匹配标签内的所有内容。匹配结果如下:
这是一个标题。
这是另一个。
整个字串都被返回。*操作符会连续匹配所有内容——甚至包括中间的h1闭合标签。因为它是贪婪的,匹配整个字串是符合其利益最大化原则。懒惰操作符把上面的式子稍作修改,加上一个问号(?),能让表达式变懒惰:/
.*?
/这样它会觉得,只需匹配到第一个h1结尾标签就完成任务了。另一个有着类似属性的贪婪操作符是{n,}。它代表之前的匹配模式重复n次或n次以上,如果没有加上问号,它会寻找尽可能多的重复次数,加上的话,则会尽可能少
4、重复(当然也就是“重复n次”最少)。#建立字串$str='hihihioopshi';#使用贪婪的{n,}操作符进行匹配preg_match('/(hi){2,}/',$str,$matches); #matches[0]将是'hihihi'#使用堕化了的{n,}?操作符匹配preg_match('/(hi){2,}?/',$str,$matches); #matches[0]将是'hihi'2.回返引用(Backreferencing)有什么用?回返引用(Backreferencing)一般被翻译成“反向引用”、“后向引用”、“向后引用”,个人觉得“回返引用”更为贴切[笨活儿]。
5、它是在正则表达式内部引用之前捕获到的内容的方法。例如,下面这个简单例子的目的是匹配出引号内部的内容:#建立匹配数组$matches=array();#建立字串$str=""Thisisa'string'"";#用正则表达式捕捉内容preg_match("/("
6、').*?("
7、')/",$str,$matches);#输出整个匹配字串echo $matches[0];它会输出:"Thisisa'显然,这并不是我们想要的内容。这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配。这是因为表达式里说:("
8、'),也就是双引号(")和单引号(')均可。要修正这个问题,你
9、可以用到回返引用。表达式1,2,…,9是对前面已捕获到的各个子内容的编组序号,能作为对这些编组的“指针”而被引用。在此例中,第一个被匹配的引号就由1代表。如何运用?将上面的例子中,后面的闭合引号替换为1:preg_match('/("
10、').*?1/',$str,$matches);这会正确地返回字串:"Thisisa'string'"译注思考题:如果是中文引号,前引号和后引号不是同一个字符,怎么办?还记得PHP函数preg_replace吗?其中也有回返引用。只不过我们没有用1…9,而是用了$1…$9…$n(此处任意数目均可)作为回返指针。例如,如果你想把所有的段
11、落标签
都替换成文本:$text=preg_replace('/
(.*?)
/',"<p>$1</p>",$html);参数$1是一个回返引用,代表段落标签
内部的文字,并插入到替换后的文本里。这种简便易用的表达式写法为我们提供了一个获取已匹配文字的简单方法,甚至在替换文本时也能使用。3.已命名捕获组(NamedGroups)当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1…9)都代表哪一个子内容