正则表达式基础
1.元字符 .匹配除换行符以外的任意字符
2.字符转义
如果你想查找元字符本身的话,比如你查找.,或者*来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找本身,你也得用.
3.重复
*重复零次或更多次 +重复一次或更多次 ?重复零次或一次 {n}重复n次 {n,}重复n次或更多次 {n,m}重复n到m次 4.字符
要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元 音字母a,e,i,o,u),应该怎么办?很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。 5.分支条件 不幸的是,刚才那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的指的是有几种规则,如 果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。 d{5}-d{4}|d{5}这个表达式用于匹配美国的邮政编码。美国邮编 的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。 如果你把它改成d{5}|d{5}-d{4}的话,那么就只会匹配5位的邮编(以及9位邮 编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。 6.子表达式 每一个(exp)都代表一个子表达式。 7.反义 W匹配任意不是字母,数字,下划线,汉字的字符 S匹配任意不是空白符的字符 D匹配任意非数字的字符 B匹配不是单词开头或结束的位置 [^x]匹配除了x以外的任意字符 [^aeiou]匹配除了aeiou这几个字母以外的任意字符 8.后向引用 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它 程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括 号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 b(w+)bs+1b可以用来匹配重复的单词,像go go,或者kitty kitty。这个表达式首先是一个单词, 也就是单词开始处和结束处之间的多于一个的字母或数字(b(w+)b), 这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(1)。 你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>w+)(或者把尖括号换成'也 行:(?'Word'w+)),这样就把w+的 组名指定为Word了。要反向引用这个分组捕获的 内容,你可以使用k<Word>,所以上一个例子也可以写成这样:b(?<Word>w+)bs+k<Word>b。
9.零宽断言
?=exp)也叫零宽度正预测先行断言, 它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb), 匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 (?<=exp)也叫零宽度正回顾后 发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=bre)w+b会匹配以re开头的单词的后半部 分(除了re以外的部分),例如在查找reading a book时,它匹配ading。 10.负向零宽断言 前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确 保某个字符没有出现,但并不想去匹配它时怎么办?负向零宽断言能解决这 样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:bw*q(?!u)w*b。 零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:d{3}(?!d)匹 配三位数字,而且这三位数字的后面不能是数字;b((?!abc)w)+b匹 配不包含连续字符串abc的单词。 11.贪婪与懒惰 当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的 字符。以这个表达式为例:a.*b,它将会匹配最长的以 a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。 有时,我们更需要懒惰匹配,也就是匹配尽可能少的 字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提 下使用最少的重复。现在看看懒惰版的例子吧: a.*?b匹配最短的,以a开始,以b结 束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。 为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另 一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。 12.平衡组/递归匹配这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法。 为了避免(和(把你的大脑 彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来? 这里需要用到以下的语法构造:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 在Rails 3中返回空的JSON响应的首选方法是
- 正则式入门教程
- c# – DllImport vs LoadLibrary,最好的方法是什么?
- Cocos2D:塔防游戏制作之旅(八)
- ruby-on-rails – 如何将Rails config.time_zone设置为GMT
- 在Swift中声明一个类之外的私有常量
- c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码
- ruby-on-rails – 如何检测rails应用程序是否在Unicorn下运
- 领域模型驱动设计(DDD)之模型提炼
- PostgreSQL default_statistics_target