-(连字符)是一个特殊的元字符,作为元字符只能用在[]之间,再字符集外的地方,-只是一个普通字符,只能与本身匹配。因此,在正则表达式里面,-字符不需要被转义。
^的效果作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在^字符后面的那一个字符或字符区间
[] 回退(并删除)一个字符(backspace键)
f 换页符
换行符
回车符
制表符(Tab键)
v 垂直制表符
是Windows使用的文本行结束标签
Unix和Linux系统只使用一个换行符来结束一个文本行
d 任意一个(单个)数字字符(等价于[0-9])
D 任意一个非数字字符(等价于[^0-9])
w 任意一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_])
W 任意一个非字母数字字符且非下划线字符(等价于[^a-zA-Z0-9_])
s 任意一个空白字符(等价于[f
v])
S 任意一个非空白字符(等价于[^f
v])
[]元字符是一个特例,不在s S覆盖范围内
十六进制数要用x作为前缀,八进制数用 作为前缀,如x0A对应于ASCII字符10(换行符),其效果等价于 , 11等价于
POSIX字符类:
[:alnum:] 任意一个字母或数字(等价于[a-zA-Z0-9])
[:alpha:] 任意一个字母(等价于[a-zA-Z])
[:blank:] 空格或制表符(等价于[ ],注意t后面有个空格)
[:cntrl:] ASCII控制字符(ASCII 0到31,再加上ASCII127)
[:digit:] 任意一个数字(等价于[0-9])
[:graph:] 和[:print:]一样,但不包括空格
[:lower:] 任意一个小写字母(等价于[a-z])
[:print:] 任意一个可打印字符
[:punct:] 既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符
[:space:] 任意一个空白字符,包括空格(等价于[^f
v ],注意v后面有个空格)
[:upper:] 任意一个大写字母(等价于[A-Z])
[:xdigit:] 任意一个十六进制数字(等价于[a-fA-F0-9])
如要找出HTML代码中的RGB值(形如#333666):
#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]
+匹配前一个字符一次或多次,+如果在字符集合[]内部,只能表示匹配加号,当在字符集合内部使用的时候,像.和+这样的元字符将被解释成普通字符,不需要转义,但是转义了也没有坏处。[w.]和[w.]的使用效果是一样的。
*匹配前一个字符零次或多次
?匹配前一个字符零次或一次
{} 重复次数(interval),如
{3}表示匹配前一个字符恰好三次
前面的#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]可写成#[[:xdigit:]]{6}
{2,4}表示至少匹配2次,至多4次
{0,1}等价于?
{1,}至少重复一次,等价于+
文本串:
This offer is not available to customers living in <B>AK</B> and <B>HI</B>
正则表达式:
<[Bb]>.*</[Bb]>
结果:
<B>AK</B> and <B>HI</B>
原因:
.*是贪心算法,将匹配第一个<B>和最后一个</B>之间的所有文本
*?是*的非贪心版本
文本串:
This offer is not available to customers living in <B>AK</B> and <B>HI</B>
正则表达式:
<[Bb]>.*?</[Bb]>
结果:
<B>AK</B>
<B>HI</B>
用来匹配一个单词的开始或结尾(boundary),匹配的是这样一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与w相匹配的字符)和一个不能用来构成单词的字符(也就是与W相匹配的字符)之间,只匹配位置,不匹配字符,如:
文本串:
The cat scattered his food all over the room.
正则表达式:
cat
结果:
cat
B 表示不匹配一个单词边界,如B-B将匹配" - ",不匹配"nine-digit"中的'-'
^ 表示字符串开头,当且仅当^出现在[]之间并紧跟在[之后表示求非
$ 表示字符串结尾
许多正则表达式都支持使用一些特殊的元字符去改变另外一些元字符的行为的做法,如用来启用分行匹配模式(mulitline mode)的(?m)放在整个模式串的最前面将使得正则表达式引擎把行分隔符当作一个字符串分隔符来对待。在分行匹配模式下,^不仅能匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置(这个位置是不可见的);类似的,$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。如:
要找出代码中//的注释
(?m)^s*//.*$
有些正则表达式实现还支持A定义一个字符串的开始(同^),B定义一个字符串的结束的做法(同$),当A B的行为不会被(?m)改变
() 表示一个子表达式
要匹配年份数字
文本串:
ID: 042
SEX: M
DOB: 1967-08-17
Status: Active
正则表达式:
19|20d{2}
结果:
19
原因:
|将左边和右边的两个部分都视为一个整体,即(19)|(20d{2})
修改:
(19|20)d{2}
结果:
1967
回溯引用匹配:
文本:
This is a block of of text, several words here are are repeated, and and they should not be.
正则表达式:
[ ]+(w+)[ ]+1
结果:
of of
are are
and and
原因:
1代表模式里的第1个子表达式,同理2代表第2个,3代表第3个……
在一些正则表达式实现里面 代表整个正则表达式
替换:
文本:
Hello, ben@forta.com is my email address.
正则表达式:
(w+[w.]*@[w.]+.w+)
替换:
<A HREF="mailto:$1">$1</A>
结果:
Hello, <A HREF="mailto:ben@forta.com">ben@forta.com</A> is my email address.
文本:
313-555-1234
248-555-9999
810-555-9000
正则表达式:
(d{3})(-)(d{3})(-)(d{3})
替换:
($1) $3-$5
结果:
(313) 555-1234
(248) 555-9999
(810) 555-9000
E 结束L或U转换
l 把下一个字符转换成小写
L 把L到E之间的字符全部转换成小写
u 把下一个字符转换成大写
U 把L到E之间的字符全部转换成大写
(?=) 表示向前查找
文本:
http://www.forta.com/
https://mail.forta.com/
ftp://ftp.forta.com/
正则表达式:
.+(?=:)
结果:
http
http
ftp
结果中不包含:
(?<=) 表示向后查找
文本:
ABC01: $23.45
HGG42: $5.31
CFMX1: $899.00
XTC99: $69.96
Total items found: 4
正则表达式:
(?<=$)[0-9.]+
结果:
23.45
5.31
899.00
69.96
文本:
<head>
<title>Ben Forta's Homepage</title>
</head>
正则表达式:
(<?<=<[tT][iI][tT][lL][eE]>).*(?=</[tT][iI][tT][lL][eE]>)
结果:
Ben Forta's Homepage
(?!) 负前向查找
(?<!) 负后向查找