正则表达式必知必会 1

匹配单个字符

匹配纯文本

#

文本: My name is Ben

正则表达式: Ben

结果: Ben

这里使用的正则表达式是纯文本,匹配原始文本里面的Ben.

#

文本: Hello, my name is Ben, my website is benforta.com

正则表达式: my

结果: my

这里的正则表达式匹配了第一个my,但忽略了第二个my.默认情况下,正则表达式只匹配第一个匹配的结果,如果想把所有结果找出来,(例如在JavaScript里),可以使用g(global).

此外,正则表达式会区分大小写,my可以匹配my,但不能匹配My.

匹配任意字符

.在正则表达式里面可以匹配任意字符,甚至是字符本身.

#

文本: sales.xls sales1.xls sales2.xls ape.xls enrope.xls na1.xls na2.xls

正则表达式: sales.

结果: sales. sales1 sales2

这里的.匹配了sales后的单个字符,所以只有sales1.xls和sales2.xls与之匹配.

#

文本: sales.xls sales1.xls sales2.xls ape.xls enrope.xls na1.xls na2.xls

正则表达式: .a..xls

结果: na1.xls na2.xls

这里的正则表达式中有一个\,表示转义.转义之后的.字符不再表示其在正则表达式里的意思,而只匹配一个普通的点.

匹配一组字符

匹配多个字符中的某一个

#

文本: sales.xls sales1.xls sales2.xls sa1.xls ape.xls enrope.xls na1.xls na2.xls

正则表达式: [ns]a..xls

结果: sa1.xls na1.xls na2.xls

这里的正则表达式中的[na]表示匹配n和a中的任意一个字符.

#

文本: The phrase “regular expression” is often abbreviated as “regex” or “RegEx”

正则表达式: [Rr]eg[Ee]x

结果: regex, RegEx

利用字符集合区间

#

文本: sales.xls sales1.xls sales2.xls sa1.xls ape.xls enrope.xls na1.xls na2.xls sam.xls

正则表达式: [ns]a[0123456789].xls

结果: sa1.xls na1.xls na2.xls

这里的文本中新加了一个sam.xls,但是我们只想匹配以n或s开头,以数字结尾的字符串,所以我们定义了一个数字区间来匹配所有的数字.但是这里的字符区间只匹配0-9,不能匹配10,20或者100.

  • tips: 上面的[0123456789]可以用[0-9]来代替
  • 还有一些可以也能使用连字符来代替的有: [a-z] [A-Z] 等等.

note: 连字符-是一个特殊的元字符,作为元字符它只能被用在[]之间,否则它就只是一个普通的字符与-匹配,不需要转义.

在一个字符集合里可以给出多个字符区间,比如下面这个集合里可以匹配任意的字母和数字(0-9之间):

[a-zA-Z0-9]

#

匹配RGB值(RGB值是由6个连续的任意字符或者0-9间的数字构成)

文本: \

正则表达式: #[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]

结果: #336655, #FFFFFF

取非匹配

#

文本: sales.xls sales1.xls sales2.xls sa1.xls ape.xls enrope.xls na1.xls na2.xls sam.xls

正则表达式: [ns]a[^0-9].xls

结果: sam.xls

这里的^表示非,所以[^0-9]就表示不是0-9中数字的任意一个.

使用元字符

对特殊字符进行转义

元字符: 在正则表达式里面有特殊含义的字符,例如.是一个元字符,用来匹配任意字符.^是一个元字符,用来取非.

转义: 如果想要匹配字面意义上的元字符(而不是其在正则表达式里的意思),就需要进行转义.通常是在元字符前面加上反斜杠\.

文本:

1
2
3
4
5
var myArray = new Array();

if (myArray[0] == 0) {
  ...
}

正则表达式: myArray[0]

结果: myArray

本想匹配整个myArray[0],但却只匹配了myArray.因为[0]在正则表达式里表示集合中的一个,这里就是0,所以它期待的结果是myArray后面跟上0-9之间任意一个数字,这里没有匹配的结果,所以只匹配到了前面的字符串,所以需要对[]进行转义.

正确的正则表达式: myArray[0] 或者myArray[[0-9]]来匹配第0个到第9个数组.

note: 因为\在正则表达式里面也是一个元字符,如果想要匹配\,也需要对其转义,即\\.

下面的这张图表总结了一些特殊的元字符:

tips: 可以使用\r\n来匹配一个回车+换行的组合.

匹配特定的字符类别

匹配数字与非数字

\d: 匹配任意一个数字字符,等价于[0-9]

\D: 匹配任意一个非数字字符,等价于[^0-9]

匹配字母和数字与非字母和数字

字母和数字: A-Z, a-z, 0-9和下划线_.

\w: 匹配任意一个字母数字字符或下划线集合(等价于[A-Za-a0-9])

\W: 与上面的匹配相反(等价于[^A-Za-a0-9])

匹配空白字符和飞空白字符

\s: 匹配任意一个空白字符(等价于[\f\n\r\t\v])

\S: 匹配任意一个非空白字符(等价于[^\f\n\r\t\v])

使用POSIX字符类

POSIX是许多正则表达式(但不是所有,例如JavaScript就不支持POSIX)都支持的一种简写形式.

下面是POSIX字符表:

可以使用POSIX来代替上面的一个例子:

#

文本: \

正则表达式: #[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]

结果: #336655, #FFFFFF

这里的POSIX使用了两层括号,里面的一层表示POSIX字符类,外面的那一层表示字符集和.