正则表达式其实很简单
正则表达式的匹配规则是从左到右按规则匹配。
单个字符匹配
精确匹配
• 对于正则表达式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 php
和 hello go
一般是这样写的:hello\sJavaScript|hello\sphp|hello\sgo
,可以把公共部分提出来,然后用(...)把子规则括起来表示成hello\\s(JavaScript|php|go)
。
• (...)的另一种用法,可以实现分组匹配。有这样一个正则表达式:\d{3,4}\-\d{6,8}
,匹配的是区号-电话号。匹配成功后,我们想提取区号和电话号码,分别存入数据库。我们可以这样做:先用(...)先把要提取的规则分组,把上述正则表达式变为(\d{3,4})\-(\d{6,8})
。