正则表达式其实很简单

正则表达式的匹配规则是从左到右按规则匹配。

单个字符匹配

精确匹配

• 对于正则表达式abc,只能精确匹配字符串"abc",而不能匹配"ab","Abc","abcd"等其他任何字符串。

• 如果正则表达式有特殊字符,需要用\转义。比如,正则表达式a&b ,其中&是用来匹配特殊字符&的,它能精确匹配字符串"a&b",但是不能匹配"ac"、"a-c"、"a&&c"等字符串。

注意:正则表达式在JavaScript代码中也是一个字符串,所以,对于正则表达式a&b,对应的JavaScript字符串是"a\&b",因为\也是JavaScript字符串的转义字符,两个\实际上表示的是一个\:

• 如果想匹配非ASCII字符,例如中文,就用十六进制表示,例如:a\u548cb匹配字符串"a和b",中文字符和的Unicode编码是548c。

匹配任意字符

.

精确匹配一般用的比较少,我们直接通过String类的equals()方法就可以实现。大多数情况下,我们想要模糊匹配。我们可以用.匹配一个任意字符。

例如,正则表达式a.b中间的.可以匹配一个任意字符,下面的字符串都可以匹配到:

"abb"
"a&b"
"acb"

注意 但它不能匹配"ab"、"a&&b",因为.匹配一个字符且仅限一个字符。

匹配数字

\d

如果我们只想匹配0~9这样的数字,可以用\d`匹配。

例如,正则表达式00\d,可以匹配:

001
002
003

注意:它不能匹配"0011"、"0022",因为\d仅限单个数字字符。

匹配字母、数字或下划线

\w

w的意思是word,可以匹配一个字母、数字或下划线。

例如,hello\w可以匹配:

hello1
hellow
hello_

它不能匹配hello#、hello@、helloworld等,因为\w只能匹配一个字符,且仅支持字母、数字或下划线

匹配空格字符和制表符

\s

例如,a\sb可以匹配:

a b
a b

它不能匹配ab、acb,因为\s仅限单个空格或者\t字符。

匹配非数字

\D

用\d可以匹配一个数字,而\D则匹配一个非数字。

例如,00\D可以匹配:

00A
00#
00@

同样的,\W可以匹配\w不能匹配的字符,\S可以匹配\s不能匹配的字符。

小结:

正则表达式规则说明示例
a精确匹配a
\u548c指定一个Unicode字符
.任意一个字符a,b,#,¥
\d任意一个数字(0~9)0 ~ 9
\w任意一个大小写字母,数字和下划线az,AZ,0~9,_
\s空格、Tab键空格,Tab
\D非数字a,A,&,_
\W非\w
\S非\s

多个字符匹配

上面介绍的只能每次匹配一个字符,如果要匹配多个字符,怎么办呢?我们可以使用修饰符来实现。

匹配0个或者任意多个字符

*

例如,a\d*可以匹配:

a
a0
a111

匹配至少一个字符

+

例如,a\d+可以匹配:

a0
a10

注意:但它无法匹配"a",因为修饰符+要求至少一个字符。

匹配0个或一个字符

?

例如,a\d?可以匹配:

a
a0

注意:但它无法匹配"a10",因为修饰符?超过1个字符就不能匹配了。

匹配n个字符

{n}

例如,a\d{3},可以匹配:

a110

匹配n~m个字符

{n,m}

例如,a\d{1,3},可以匹配:

a0
a10
a110

匹配至少n个字符

{n,}

例如,a\d{3,},可以匹配:

a110
a110111010101010

匹配最多n个字符

{0,n}

例如,a\d{0,3},可以匹配:

a0
a01
a001

小结:

正则表达式规则说明示例
*任意个数字符
+至少1个字符
?0个或1个字符
{n}指定n个字符
{n,m}指定n~m范围字符
{n,}至少n个字符
{0,n}最多n个字符

复杂规则匹配

匹配开头和结尾

匹配开头:^
匹配结尾:$

我们用^表示开头,$表示结尾。例如,^A\d{3}$,可以匹配"A001"、"A380"。

匹配指定范围

[...]

我们可以使用[...]可以匹配范围内的字符,例如:

• [123456789]可以匹配1~9,还有一种写法,直接写[1-9]就可以。

• 匹配大小写不限的十六进制数,比如1A2b3c,我们可以这样写:[0-9a-fA-F]

• [...]还有一种排除法,即不包含指定范围的字符。假设我们要匹配任意字符,但不包括数字,可以写[^1-9]{1}

或规则匹配

|

| 连接的两个正则规则是或规则,例如,A | C表示可以匹配A或C。

使用括号

(...)

• 提取公共部分我们想要匹配字符串hello JavaScript、hello phphello go 一般是这样写的:hello\sJavaScript|hello\sphp|hello\sgo,可以把公共部分提出来,然后用(...)把子规则括起来表示成hello\\s(JavaScript|php|go)

• (...)的另一种用法,可以实现分组匹配。有这样一个正则表达式:\d{3,4}\-\d{6,8},匹配的是区号-电话号。匹配成功后,我们想提取区号和电话号码,分别存入数据库。我们可以这样做:先用(...)先把要提取的规则分组,把上述正则表达式变为(\d{3,4})\-(\d{6,8})

贡献者: mankueng