备忘(五)正则表达式

来源:互联网 发布:怎么变漂亮知乎 编辑:程序博客网 时间:2024/05/22 16:43

 正则表达式(Regular Expression)是一种功能强大的字符串样式比较技术。正则表达式最早是从UNIX系统被开发出来的。它是由一群特殊符号所组成的字符串,表示特定的文字样式,被用于比较某段字符串或文章里,符合正则表达式所代表的样式文字,例如,一个简单的正则表达式【1-9】,可以用来表示字符串中1-9的数字。.NET根据Perl语言定义了与其完全兼容的一组完整的语法元素。

1.     正则表达式中的元字符

 正则表达式中的元字符代表了表示字符的全部意义。都有哪些常用的元字符呢。

元字符

 

匹配除换行符外的所有字符。

/w

匹配字母、数字、下划线、汉字。

/s

匹配空白符(空格)。

/d

匹配数字。

/b

绝对匹配表达式的开始或结束。表达式中只要包含完全匹配即可。

^

绝对匹配表达式的开始。和$配合表示必须完全匹配。

$

绝对匹配表达式的结束。和^配合必须完全匹配。

关于^$/b的使用区别。

^/w{3}@/w+$:这个正则表达式表示完全匹配。如abc@efg@msn这个表达式不满足此表达式。/b/w{3}@/w+/b:这个正则表达式表示字符串中部分绝对匹配。如上面的表达式结果是abc@efg

 

2.     正则表达式中用于表示重复的字符

元字符

说明

举例

*

0次或多次的字符

/w*0个或多个字母、数字、汉字、下划线

0次或1次字符

/d?0个或1个数字。

+

1次货多次字符

/d+1个或多个数字。

{n}

n次字符。

/b/d{8}/b:决定匹配8个数字,如果没有/b则包含8个数字即可。

{n,M}

nM次字符

/d{2,6}26个数字。

{n, }

n次以上字符

/d{2,}:两个以上的数字。

3.     转义字符

  正则表达式中的转义字符用“/”来完成。例如我们要匹配“”的正则表达式:^/d{3}//w{2}$。那么匹配它的字符串应该是这样的形式:024Ab。因为“”在正则表达式中是元字符代表除换行符外的所有字符,所以需要转义。

4.     范围内字符匹配:[ ]

  正则表达式利用[ ]来匹配范围内的字符串。例如[auio]/d{3}表示开头匹配auio总的任何一个字符,后面是三位数字的字符串。[01]表示匹配01的任何字符。[0-9a-zA-Z]表示所有数字和字母。

5.     分支条件

 利用“|”把规则分开,并从左向右进行匹配。表示匹配的字符串满足其中一个规则即可。例如我们编写正则表达式实现电话号码的匹配形式为:024-23887575 02423887575)或0411-234575904112345759)。我们可以这样来实现:^/d{3}[-]?/d{8}$|^/d{4}[-]?/d{7}$。

6.     分组匹配

   前面我们已经学过怎么重复单个字符(直接在字符后面加上限定符)如:/b[a]{3}/d+/b。表示以aaa开头后面是多个数字。但是如果想要重复多个字符又该怎么办呢。我们可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个表达式的重复次数了。例如我们编写正则表达式来匹配简单的ip地址。(/d{1,3}/. .{3}/d{1,3}。要理解这个表达式,请按照下列顺序分析它:/d{1,3}匹配1-3位数字,(/d{1,3}/ .{3}匹配三位数字加上一个小数点,作为分组重复3次。

7.     反义元字符

  有时需要查找不属于某个能简单定义的字符类的字符。比如想找除了数字意外其它的任意字符,这时就需要用到反义。在正则表达式中表示反义的元字符有:

元字符(大写)

  

/W

除了字母、数字、下划线、汉字外的所有字符。

/S

除了空格外的所有字符。

/D

除了数字意外的所有字符。

/B

除了开头和结尾外绝对匹配。

[^X]

除了X以外的其它字符。

[^auio]

除了auio外的其它字符。

8.     反向引用

  使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以小括号的左括号为标志,第一个出现的分组组号为1,第二个为2,以此类推。

  后向引用用于重复收索前面某个分组匹配的文本。例如/1代表分组1匹配的文本。难以理解?我们看看实例。/b(/w+)/b/s+/1/b这个正则表达式可以用来匹配重复的表达式,如:go go或者Help  Help。这个表达式中的(/w+)被分组并命名组号为1,而后面的/1表示重复前面的表达式的内容。这个重复与前面的重复的字符不同,它代表重复的内容,而重复字符是指重复的形式。

  你也可以自己指定子表达式的组名。语法形式:(?<Word>/w+)。这个语法“?<world>”就把子表达式的组名命名为“wold”了。如果想捕获前面的组中的内容实用这样的语法:“/k<world>”上面的正则表达式可以改为:/b(?<world>/w+)/b/s+/k<world>/b

9.     零宽断言

  零宽断言是指利用表达式来指定一个位置,这个位置应该满足一个条件。如:/b^$。对于零宽断言我们有以下几个形式:

Ø         (?=exp):零宽度正预测先行断言。它表示断言自身出现的位置的后面能匹配表达式exp结果得到前面部分,不包括exp表达式本身的内容。例如:/b/w+(?=ing/b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing。时,它会匹配singdanc。(相当于字符串的后面部分与exp匹配)。断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续匹配。

Ø         (?!exp):零宽度负预测先行断言。它断言此位置的后面不能匹配表达式exp。例如:/d{3}(?!/d)。它表示匹配三位数字后不能是数字。

Ø         (?<=exp):零宽度正回顾后发言,它断言自身出现的位置的前面能匹配表达式exp,结果得到除了Exp表达式的后半部分。例如:?<=/bre/w+/b。它表示匹配以re开头的单词的后半部分(除了re部分)。如查找字符串reading a book时,它的匹配结果是ading

Ø         (?<!exp):零宽度负预测先行断言:它断言此位置的后面不能匹配表达式exp。例如:(?<![a-z])/d{7}表示匹配前面不是小写字母的7为数字。

一个更为复杂的例子:(?<=<(/w+)>).*(?=<V/1>)它匹配不包含属性的简单HTML标签里的内容。

10. 贪婪与懒惰

  当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,他将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab,它会匹配aabab整个串。这被称为贪婪匹配。有时我们需要匹配尽可能少的串,我们称为懒惰匹配。我们只需将前面的表达式改动一下,加一个“?”即可。a.*?b:匹配最短的,以a开始,以b结束的字符串。结果就是aabab

我们来看一下懒惰限定符:

字符

说明

*?

重复任意次,但尽可能少重复。

+?

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

??

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

{n,m}?

重复n次到m次,但尽可能少重复。

{n,}?

重复n次以上,但尽可能少重复。

原创粉丝点击