正则表达式
正则表达式在编码中经常可以做到四两拨千斤的效果,正则表达式是一个优秀程序员的必备技能。
正则表达式是一种文本模式,包括普通字符(例如,a到Z之间的字母)和特殊字符(元字符)。模式描述在搜索文本时要匹配一个或多个字符串。
1.用途
正则表达式的使用广泛,主要有以下四种:
正则表达式通常用于两项任务,1.验证,2.搜索/替换。
用于验证时,通常需要在前后加上^和$
,以匹配整个待验证字符串;搜索/替换时是否加上此限制需要根据搜索的要求而定。此外,也有可能要在前后加上\b
而不是^和$
。
2.优先权顺序
在构造正则表达式之后,就可以像数学表达式一样来求值,也就是说,可以从左至右按照一个优先权顺序来求值。下表列出的操作符按照优先级从高到低排序:
操作符
描述
\|转义符
(),(?:),(?=),[]
圆括号和方括号
*,+,?,{n},{n,},{n,m}
限定符
^,$,\angmetacharacter
位置和顺序
3.直接量字符
字符
匹配
字母和数字字符
自身
\o
NUL字符
\t
制表符(\u0009)
\n
换行符(\u000A)
\v
垂直制表符(\u000B)
\f
换页符(\u000C)
\r
回车符(\u000D)
\xnn
由十六进制数nn指定的拉丁字符
\uxxx
是由十六进制xxx指定的Unicode字符
\cX
控制字符^X
如果记不住哪些标点符号需要反斜杠转义,可以在每个标点符号前都加上反斜杠。
4.字符类匹配
字符
匹配
[...]
方括号内的任意字符
[^...]
不在方括号内的任意字符
.
除了换行符和其他Unicode行终止符之外的任意字符
\w
任意ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W
任意不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s
任何Unidoce空白符
\S
任何非Unicode空白符,注意\W和\S的不同
\d
任何ASCII数字,等价于[0-9]
\D
除了ASCII数字之外的任何字符,等价于[^0-9]
[\b]
退格直接量
方括号又叫字符组,注意某些元字符在字符组外和字符组内的意义不同。例如:
^
在字符组外匹配行的开头,在字符组内表示排除字符;-
在字符组外表示普通连字符号,在字符组内表示一个范围;问号和点号在字符组外通常是元字符,但在字符组内只是匹配普通字符而已。
5.重复字符类
字符
匹配
{n,m}
匹配前一项至少n次,但不超过m次
{n,}
匹配前一项n次或多次
{n}
匹配前一项n次
?
匹配前一项0次或1次,等价于{0,1}
+
匹配前一项一次或多次,等价于{1,}
*
匹配前一项0次或多次,等价于{0,}
JavaScript默认是贪婪匹配,也就是说匹配重复字符是尽可能多的匹配,而且允许后续的正则表达式也继续匹配。而进行非贪婪匹配,只需要在待匹配的字符后面跟随一个问号即可。比如,
/a+/
可以匹配一个或多个连续的字母a,当使用'aaa'
作为匹配字符串时,/a+/
会匹配三个字母,但是/a+?/
会尽量少的匹配,只会匹配一个。
6.选择、分组和引用字符
字符
匹配
|
选择,匹配的是该符号左边的子表达式或右边的子表达式
(...)
组合,将几项组合为一个单元,这个单元可通过'*'、'+'、'?'和’|‘等符号修饰,而且可以记住和这个相匹配的字符串以供之后的引用使用
(?...)
只组合,组合但不记忆与该组想匹配的字符
\n
和第n个分组第一次匹配的字符相匹配
7.锚字符
字符
匹配
^
匹配字符串的开头,在多行检索中,匹配一行的开头
$
匹配字符串的结尾,在多行检索中,匹配一行的结尾
\A
只有匹配字符串开始处
\b
匹配一个单词的边界,简而言之,就是位于字符\w和字符\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(但需要注意的是在字符组内[\b]匹配的是退格符)
\B
匹配非单词的边界位置
\Z
匹配字符串结束处或行尾
\z
只匹配字符串结束处
(?=p)
零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p)
零宽负向先行断言,要求接下来的字符不与p匹配
8.记录字符
字符
匹配情况
(string)
用于反向引用的分组
$1
匹配的第一个分组的内容
$2
匹配的第二个分组的内容
$3
匹配的第三个分组的内容
9.修饰符
字符
匹配
i
忽略大小写
g
执行全局匹配,即找到所有匹配,而不是找到第一个之后就停止
m
多行匹配模式,^匹配一行的开头和字符串开头,$匹配行的结束和字符串的结束
10.用于匹配模式的String方法
方法
意义
search(reg)
参数:一个正则表达式。 返回:第一个与参数字符串匹配的位置,如果找不到就返回-1,不支持全局搜索。
replace(reg, str)
检索和替换。第一个参数:正则表达式,第二个参数:要进行替换的字符串,也可以是函数。设置了g修饰符,则替换所有匹配的子串,否则只替换第一个子串。通过在替换字符串中使用“$n”,可以使用子表达式相匹配的文本来替换字符。
match(reg)
参数:一个正则表达式。 返回:一个由匹配结果组成的数组。设置g则返回所有匹配结果,否则数组的第一个元素是匹配的字符串,剩下的是圆括号中的子表达式,即a[n]中存放的是$n的内容。
split(reg)
参数:正则表达式或字符串。 返回:子串组成的数组。
11.RegExp对象
RegExp构造函数
var pattern = new RegExp(arg1, arg2);
arg1:正则表达式中两条斜杠之间的文本
arg2:可选,指定修饰符:g,m,i
RegExp的属性
属性
意义
source
只读字符串,包含正则表达式的文本。
global
只读布尔值,是否带修饰符g
ignoreCase
只读布尔值,是否带修饰符i
multiline
只读布尔值,是否带修饰符m
lastIndex
可读写整数,如果带g修饰符,这个属性储存在整个字符串中下一次检索开始的位置,这个属性会被exec()和test()方法用到。
RegExp的方法
方法
意义
exec()
参数:字符串。在一个字符串中执行匹配检索,与String.macth()非全局检索类似,返回一个数组或null。
test()
参数:字符串。检测适合符合表达式模式,返回true或者false
toString()
转换成字符串形式
compile()
既可以改变搜索模式,也可以添加或删除第二个参数
12.举个例子
1.匹配输入邮箱是否合法(邮箱的格式一般为xxx@xxx.xxx,允许字母数字下划线)
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
2.match方法
3.search方法
4.replace方法
5.pslit方法
6.exec方法
13.需要转义的字符
14.参考文献
Last updated