常用类库--正则表达式

正则表达式是用来进行文本处理的技术,是和语言无关的,在几乎所有语言中都有实现。例如,javascript等。

元字符

1>  .:用于匹配除\n之外的任何单个字符。例如a.b,匹配aab、a$b,但不匹配axab、a@cb。

2>  []:用于匹配括号中的任何一个字符(范围、字符集合)。例如:b[aui]g,匹配big、bug,但不匹配beg、baug。

注:可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字;此外还有其他常用如下:

[0-9],表示0-9中任意一个字符

[a-z],表示小写a-z中任意一个字符

[A-Z],表示大写A-Z中任意一个字符

[a-zA-Z],表示不区分大小写a~ z中任意一个字符

[a-zA-Z0-9],表示a~z中任意一个字符,或者单个数值

当“.”在[]中出现时,它就会失去其表示单个任意字符的意思,而仅仅表示一个“.”。

3>  |:表示或的意思。例如:a(x|y)b,匹配axb、ayb;

注:|的优先级最低,所以z|food,匹配z、food

4>  ():作用,一.改变优先级,二.分组。

限定符

1>  {n}:表示前面的表达式必须出现n次。

注:{n,},表示前面的表达式至少出现n次,最多不限

{n,m},至少出现n次,最多出现m次。

2>  *:表示前面的表达式出现0次或多次,等价于{0,}

3>  +:表示前面的表达式出现1次或多次,等价于{1,}

4>  ?:表示前面的表达式出现0次或1次,等价于{0,1}

注:?还可以终止贪婪模式。

5>  ^:表示字符串的开始

注:当^在[]中时,表示“非”的意思,例如[^0-9],表示除了0-9之外的任何字符。

6>  $:表示字符串的结束

简写表达式

1>  \d:表示[0-9]

2>  \D:表示[^0-9]

3>  \s:表示所有空白符

4>  \S:表示\s的反面

5>  \w:表示[a-zA-Z0-9]

6>  \W:表示\w的反面

7>  \b:表示单词的边界,表示一边是单词,一边不是单词。(注,可以用于组成单词的字符为,a-zA-Z0-9_)

贪婪模式与非贪婪模式

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。

属于贪婪模式的量词,也叫做匹配优先量词,包括:

{m,n}”、“{m,}”、“?”、“*”和“+”。

在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:

{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。

贪婪与非贪婪模式匹配原理

先看一下贪婪模式简单的匹配过程。

源字符串:"Regex"

正则表达式:".*"

 

注:为了能够看清晰匹配过程,上面的空隙留得较大,实际源字符串为“”Regex””,下同。

来看一下匹配过程。首先由第一个“"”取得控制权,匹配位置0位的“"”,匹配成功,控制权交给“.*”。

.*”取得控制权后,由于“*”是匹配优先量词,在可匹配可不匹配的情况下,优先尝试匹配。从位置1处的“R”开始尝试匹配,匹配成功,继续向右匹配,匹配位置2处的“e”,匹配成功,继续向右匹配,直到匹配到结尾的“”,匹配成功,由于此时已匹配到字符串的结尾,所以“.*”结束匹配,将控制权交给正则表达式最后的“"”。

"”取得控制权后,由于已经在字符串结束位置,匹配失败,向前查找可供回溯的状态,控制权交给“.*”,由“.*”让出一个字符,也就是字符串结尾处的“”,再把控制权交给正则表达式最后的“"”,由“"”匹配字符串结尾处的“"”,匹配成功。

此时整个正则表达式匹配成功,其中“.*”匹配的内容为“Regex”,匹配过程中进行了一次回溯。

接下来看一下非贪婪模式简单的匹配过程。

源字符串:"Regex"

正则表达式:".*?"

看一下非贪婪模式的匹配过程。首先由第一个“"”取得控制权,匹配位置0位的“"”,匹配成功,控制权交给“.*?”。

.*?”取得控制权后,由于“*?”是忽略优先量词,在可匹配可不匹配的情况下,优先尝试不匹配,由于“*”等价于“{0,}”,所以在忽略优先的情况下,可以不匹配任何内容。从位置1处尝试忽略匹配,也就是不匹配任何内容,将控制权交给正则表达式最后的“”。

"”取得控制权后,从位置1处尝试匹配,由“"”匹配位置1处的“R”,匹配失败,向前查找可供回溯的状态,控制权交给“.*?”,由“.*?”吃进一个字符,匹配位置1处的“R”,再把控制权交给正则表达式最后的“"”。

"”取得控制权后,从位置2处尝试匹配,由“"”匹配位置1处的“e”,匹配失败,向前查找可供回溯的状态,重复以上过程,直到由“.*?”匹配到“x”为止,再把控制权交给正则表达式最后的“"”。

"”取得控制权后,从位置6处尝试匹配,由“"”匹配字符串最后的“"”,匹配成功。

此时整个正则表达式匹配成功,其中“.*?”匹配的内容为“Regex”,匹配过程中进行了四次回溯。

反向引用

例如:((a)x(b))\1\2\3:\1表示((a)x(b)),\2表示(a),\3表示(b)

 

Regex类

IsMath():表示只要在整个字符串中,有一部分匹配正则表达式,则返回TRUE。

Match():提取字符串,只能提取一个

Matchs():提取所有匹配的字符串

Replace():替换,使用$来提取组

 

UBB

 

posted @ 2014-09-17 20:30  百年一人  阅读(246)  评论(0编辑  收藏  举报