正则表达式入门

来源:互联网 发布:vmware安装mac os dmg 编辑:程序博客网 时间:2024/06/08 09:33

1. 元字符

.匹配除换行符以外的任意字符/w  
匹配字母或数字或下划线或汉字/s匹配任意的空白符/d匹配数字/b匹配单词的开始或结束,也就是单词的分界处,但是\b并不匹配单词分隔字符中的任何一个,它只匹配一个位置^匹配字符串的开始位置$匹配字符串的结束位置下面来看看更多的例子:

\ba\w*\b匹配以字母 a 开头的单词,先是某个单词开始处\b,然后是字母a,然后是任意数量的字母或数字 \w*,最后是单词结束处 \b\d+匹配1个或更多连续的数字。这里的 + 是和 * 类似的元字符,不同的是*匹配重复任意次,而+则匹配重复1次或多次\b\w{6}\b匹配刚好6个字母/数字的单词^\d{5,12}$元字符^和$都匹配一个位置,^匹配你要用来查找的字符串的开头,$匹配结尾。整个输入必须是5到12个数字

2. 字符转义 \

如果你想查找 . , 者* ,字符,这时会出现问题,因为它们会被解释成别的意思,这时你要使用 \来取消这些字符的特殊意义。

例如:

unibetter\.com匹配unibetter.comC:\\Windows匹配C:\Windows

3. 重复 { }

*
重复零次或多次+
重复一次或多次
重复零次一次{n}
重复n 次{n,}
重复n 次或多次{n,m}
重复n 到 m次下面是一些使用重复的例子:

Windows\d+匹配 Windows后面跟 1 个或更多个数字^\w+匹配一行的第一个单词

4. 字符类 [ ]

[aeiou]就匹配任何一个英文元音字母[.?!]匹配标点符号(.或?或!)[0-9]代表的含意与\d就是完全一致的,即一位数字[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)\(?0\d{2}[) -]?\d{8}。这个表达式可以匹配几种格式的电话号码,像(010)88886666,或 022-22334455,或02912345678等。分析:首先是一个转义字符 \( ,它能出现0次或1次(?), 然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字 \d{8}。

5. 分支条件 |

不幸的是,刚才那个表达式也能匹配 010)12345678 或 (022-87654321 这样的 “不正确”的格式。

要解决这个问题,我们需要用到分支条件。具体方法是用 | 把不同的规则分隔开。

0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。使用分支条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分支条件时,将会从左到右地测试每个条件,如果满足了某个分支的话,就不会去再管其它的条件了。

6. 分组 ( )

(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。分析:\d{1,3} 匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字( \d{1,3} )。不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。理解这个表达式的关键是理解2[0-4]\d|25[0-5]|[01]?\d\d?

7. 反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,

其它任意字符都行的情况,这时需要用到反义:

\W
匹配任意不是字母,数字,下划线,汉字的字符\S
匹配任意不是空白符的字符\D
匹配任意非数字的字符\B
匹配不是单词开头或结束的位置[^x]
匹配除了x 以外的任意字符[^aeiou]
匹配除了aeiou这几个字母以外的任意字符例子:

\S+匹配不包含空白符的字符串。<a[^>]+>匹配用尖括号括起来的以a开头的字符串。

8. 贪婪与懒惰  ?

*?重复任意次,尽可能少重复+?重复1次或更多次,尽可能少重复??重复0次或1次,尽可能少重复{n,m}?重复n到m次,尽可能少重复{n,}?重复n次以上,尽可能少重复贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符。

a.*b它将会匹配最长的以 a开始,以b结束的字符串,用它来搜索aabab的话,它会匹配整个字符串aabab。

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

a.*?b匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。