正则表达式总结-精简版

作者:Danbo 2016-03-08

元字符(metacharacter):

\b 表示一个单词的开头或者结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
比如:我们要匹配hi后面不远处的Lucy,就应该用\bhi\b.*\bLucy\b

. 表示匹配除了换行符以外的任意字符。

* 表示数量,指定*前边的内容可以连续重复施一公任意次以使整个表达式得以匹配。

.* 表示任意数量不包含换行的字符。

\n 表示换行符

\d 匹配一位数字。\d{2} 表示前面的\d 必须连续重复匹配2次。\d{5,12} 表示前面的\d重复5到12次。

\s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格。

\w 匹配字母或者数字或下划线或汉字。在正则表达式里的单词的意思是:不少于一个的连续的\w。

+ 表示匹配1个或多个前卖弄的内容。注意*是匹配任意以此,有可能是0次。

^ 匹配字符串的开始。

$ 匹配字符串的结束。

常用的元字符如下所示:

正则表示式引擎通常会提供一个“测试指定的字符串是否匹配一个正则表达式”的方法。

字符转义

如果你想查找元字符本身的话,比如查找“.”、“*”,就出现问题了,你没办法指定它们,此时就需要使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。如果要查找\本身,就需要使用\\。

例如:unibetter\.com匹配unibetter.com

重复

常用的限定符

字符类

[aeiou]就可以匹配任何一个英文元音字母,[.?!]匹配标点。

我们也可以轻松地指定一个字符范围,像[0-9]代表含义与\d就是完全一致的。同理[a-z0-9A-Z]也完全等同于\w。

例如下面这个复杂的表达式:\(?0\d{2}[) -]?\d{8})

注意这里的“(”、“)”,也是元字符。

上面这个表达式可以匹配以下几种电话号码,像(010)88886666或 010-88886666或 010-88886666

分组

示例:匹配个IP地址

((2[0-4]\d | 25[0-5] | [01]?\d\d?)\.){3}(2[0-4]\d | 25[0-5] | (01)\d\d?)

反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它字符都行的情况,我们就需要用到反义

常用的反义代码

例子:\S+ 表示匹配不包含空白符的字符串。

向后引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。分组0对应整个正则表达式。实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配。--因此所有命名组的组号都大于未命名组的组号。可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权。

向后引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。

例如:\b(\w+)\b\s+\1\b 可以用来匹配重复的单词,像go go,或者 uestc uestc。这个表达式手下是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符,最后是分组1中捕获的内容(也就是前卖弄匹配的按个单词)(\1)。

同时也可以自己指定子表达式的组名。要指定一个子表达式的组名,可以使用这样的语法:(?<Word>\w+)(或者吧尖括号换成'也行:(?'Word'\w+)),这样就吧\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样子:\b(?<Word>\w+)\b\s+\k<Word>\b

常用分组语法

常用的几个分组语法:

捕获:

(exp):匹配exp,并捕获文本到自动命令的组内。

(?<name>exp):匹配exp,并捕获文本到名称为name的组内,也可以写(?'name'exp)

(?:exp):匹配exp,不捕获匹配的文本,也不给此分组分配组号。

零宽断言:

(?=exp):匹配exp前面的位置。

(?<=exp):匹配exp后面的位置。

(?!=exp):匹配后面跟的不是exp的位置。

(?<!=exp):匹配前面不是exp的位置。

注释:

(?#comment):这种类型的分组不对正则表表达式的处理产生任何影响,用于提示注释让人阅读。

零宽断言

断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

(?=exp)也叫零宽度正预测先性断言,它断言自身出现的位置的后面能匹配后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面的部分,我们利用正则表达式工具看一个例子:

(?<=exp)也叫零宽度正回顾后发问断言,她断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),我们看下面这个例子:

(?<=\bre)\w+\b会匹配以re开头的单词的后版部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起来了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。

下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。

负向零宽断言

****

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符。以a.*b,它将会匹配最长的以a开始,以b结束的字符串。

有时候,我们需要懒惰匹配,也就是匹配进可能少的字符。前面给出的限定符都可以被转化为懒惰匹配,只要在它后面加上一个问号?。这样“.*?”就意味着匹配任意数量的重复,但是在使能整个匹配成功的前提下使用最少的重复。

我们看下面这个例子:

我们看到a.*?b匹配最短的,以a开始,以b结束的字符串。我们看到它应用与aabab的话,它会匹配aab和ab。

但是为什么第一个匹配是aab而不是ab呢,因为正则表达式有另一个规则,比懒惰/贪婪规则的优先级跟高:最先开始的匹配拥有最高的优先权--The match that begins earliest wins。

懒惰限定符

*? 重复任意此,但尽可能少重复

+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复

{n,m}? 重复n到m次,但尽可能少重复

{n,}? 重复n次以上,但尽可能少重复

 

一般用到的就是这些最基本的正则表达式,更复杂的可以参考一以下链接:

http://www.cnblogs.com/danbo/p/4614941.html

posted @ 2016-03-08 17:24  Danbocn  阅读(604)  评论(0编辑  收藏  举报