红炉点雪

正则表达式速查手册

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
\	#将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。"\n"与换行符匹配。序列"\\"与"\"匹配对面,"\("与"("匹配。
^ #匹配输入的开始位置。
$ #匹配输入的结尾。
* #匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。
+ #匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
? #匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。
. #匹配换行符以外的任何字符。
(pattern) #与模式匹配并记住匹配。匹配的子字符串可以从作为结果的Matches集合中使用Item[0]...[n]取得。如果要匹配括号字符(和),可使用"\("或"\)"。
x|y #匹配x或y。例如"z|food"可匹配"z"或"food"。"(z|f)ood"匹配"zood"或"food"。
{n} #n为非负的整数。匹配恰好n次。例如,"o{2}"不能与"Bob中的"o"匹配,但是可以与"foooood"中的前两个o匹配。
{n,} #n为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。
{n,m} #m和n为非负的整数。匹配至少n次,至多m次。例如,"o{1,3}"匹配"fooooood"中前三个o。"o{0,1}"等价于"o?"。
[xyz] #一个字符集。与括号中字符的其中之一匹配。例如,"[abc]"匹配"plain"中的"a"。
[^xyz] #一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]"可以匹配"plain"中的"p".
[0-9] #匹配0-9之间的任意1个数字。
[a-z] #表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何1个小写字母。
[A-Z] #表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[A-Z]"匹配"A"与"Z"之间的任何1个大写字母。
[^m-z] #否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。
\b #与单词的边界匹配,即单词与空格之间的位置。例如,"er\b"与"never"中的"er"匹配,但是不匹配"verb"中的"er"。
\B #与非单词边界匹配。"ea*r\B"与"neverearly"中的"ear"匹配。
\d #与一个数字字符匹配。等价于[0-9]。
\D #与非数字的字符匹配。等价于[^0-9]。
\f #与分页符匹配。
\n #与换行符字符匹配。
\r #与回车字符匹配。
\s #与任何白字符匹配,包括空格、制表符、分页符等。等价于"[\f\n\r\t\v]"。
\S #与任何非空白的字符匹配。等价于"[^\f\n\r\t\v]"。
\t #与制表符匹配。
\v #与垂直制表符匹配。
\w #与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。
\W #与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。
\num #匹配num个,其中num为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。
\n #匹配n,其中n是一个八进制换码值。八进制换码值必须是1,2或3个数字长。例如,"\11"和"\011"都与一个制表符匹配。"\0011"等价于"\001"与"1"。八进制换码值不得超过256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。
\xn #匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04"和"1"。允许在正则表达式中使用ASCII码。

常用正则语句

网页相关

匹配HTML标记

1
<(\S*?)[^>]*>.*?</\1>|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力。


匹配链接地址

1
href *= *['"]*(\S+)["']

评注:匹配网页上的链接地址。


匹配链接地址和标题

1
\<a href *= *['"]*(\S+)["'].*\>(.[^\<]*)?\</a>

评注:匹配网页上的链接地址及标题。


匹配网址URL

1
[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求。


匹配网站域名

1
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

评注:一个完整的域名,由根域、顶级域、二级、三级……域名构成,每级域名之间用点分开,每级域名由字母、数字和减号构成(第一个字母不能是减号),不区分大小写,长度不超过63。
很显然,单独的名字可以由正则表达式[a-zA-Z0-9][-a-zA-Z0-9]{0,62}来匹配,而完整的域名至少包括两个名字(比如google.com,由google和com构成),最后可以有一个表示根域的点(在规范中,最后有一个点的才是完整域名,但一般认为包括两个以上名字的域名也是完整域名,哪怕它后面没有点)。


匹配IP地址

1
\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用。


匹配Email地址

1
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用。


匹配图片引用地址

1
\<img.*src *= *['"]*(\S+)["'].*\>

评注:可用在网页图片提取等地方。


匹配帐号是否合法

1
^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线),表单验证时很实用。


匹配密码是否合法

1
^[a-zA-Z]\w{5,17}$

评注:密码正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。

匹配相关数字

匹配国内电话号码

1
\d{3,4}[\s,-]?\d{7,8}

评注:匹配形式如 0511-4405222 或 021-87888822。


匹配手机号码

1
1[3,4,5,8]\d[\s,-]?\d{4}[\s,-]?\d{4}+

评注:校验手机号码:必须以数字开头,除数字外,可含有“-” 或空格。


匹配腾讯QQ号

1
[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始。


匹配中国邮政编码

1
[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字。


匹配身份证号码

1
[1-9][0-9,X]{14,17}

评注:中国的身份证为15位或18位。


匹配特定的数字

1
2
3
4
5
6
7
8
9
10
^[1-9]\d*$	#匹配正整数
^-[1-9]\d*$ #匹配负整数
^-?[1-9]\d*$ #匹配整数
^[1-9]\d*|0$ #匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$ #匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ #匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ #匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ #匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ #匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ #匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正。

匹配字符串

匹配中文字符

1
2
[\u4e00-\u9fa5]
[\u4e00-\u9fa5]+ #字符串

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了。


匹配双字节字符

1
2
[^\x00-\xff]
[^\x00-\xff]+ #字符串

评注:包括汉字在内。可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)。


匹配空白行

1
\n\s*\r

评注:可以用来删除空白行。


匹配首尾空白字符

1
^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式。


匹配特定字符串

1
2
3
4
5
^[A-Za-z]+$	#匹配由26个英文字母组成的字符串
^[A-Z]+$ #匹配由26个英文字母的大写组成的字符串
^[a-z]+$ #匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ #匹配由数字和26个英文字母组成的字符串
^\w+$ #匹配由数字、26个英文字母或者下划线组成的字符串

评注:最基本也是最常用的一些表达式。


匹配多行文本

1
2
3
4
5
6
7
8
9
10
11
12
13
开始关键字([\s\S]*?)结束关键字

----应用实例:-----------------
<table>
<tr>
<td>单元格1</td><td>单元格2</td>
</tr>
<tr>
<td>单元格3</td><td>单元格4</td>
</tr>
</table>

正则表达式.创建 (“<tr>([\s\S]*?)</tr>”)

相关参考:

精易编程助手

CONTACT