正则表达式
正则表达式(regular expression)
JS的RegExp类表示正则表达式,进行强大的模式匹配和文本检索与替换。
var pattern = new RegExp(''s$') <==> var pattern = /s$/
字符串类:
[...] 方括号内任意字符
[^...] 不在括号内任意字符
. 除换行符和其他Unicode行终止符之外任意字符
\w 任何ASCII字符组成的单词,等价[a-zA-Z0-9]
\W 任何不是ASCII字符组成的单词,等价[^a-zA-Z0-9]
\s 任何unicode空白符
\S 任何非unicode空白符的字符
\d 任何ASCII数字,等价[0-9]
\D 任何非ASCII数字,等价[^0-9]
[\b] 退格直接量(特例),用来匹配单词边界,即\w和\W之间的边界,或开始和结尾
贪婪匹配:
js默认贪婪匹配
{n,m} 匹配至少n次,至多m次
{n,} 至少n次
{n} n次
? 0次或者1次,等价{0,1}
+ 1次或者多次,等价{1,}
* 0次或者多次,等价{0,}
/\w{3}\d?/ 精确匹配3个字母或数字,最后跟0个或1个数字
*和?允许什么都不匹配
非贪婪匹配:
在匹配的字符后跟随一个? {1,5}?
正则表达式总是会找字符串中第一个可能匹配位置,不考虑子串
选择符:|
匹配顺序自左到右,知道发现可能的匹配项,发现后忽略后面面的匹配
圆括号作用:
1.把单独的项组合成子表达式,方便使用|,*,+等
2.从匹配的串中抽出与圆括号的子模式相匹配的部分。 (/[a-Z]+(\d+)/),从结果中抽出数字
3.允许同一个正则式中,后面部分引用前面的子表达式,通过在“\”后加数字引用。 \1引用第一个括号
/["'][^'"]*['"]/ 可能导致左右引号不搭配
/(["'])[^'"]*\1/ 解决引号不搭配问题
4.(?:.....)只进行分组,但不能被引用,引用时被忽略
指定位置匹配:
^ 匹配字符串的开头
$ 结尾
\b 边界
\B 非单词边界
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,接下来的字符都不与p匹配
匹配单词本身: /\bjava\b/
修饰符
/.../i 不区分大小写
/.../g 全局匹配
/.../m 多行匹配
可混搭
用于模式匹配的String方法:
search():参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,若无则返回-1。若参数不是正则表达式,则首先通过regexp构造函数将其转为正则式
replace():第一个参数为正则式,第二个为替换的字符串,有/.../g则替换所有,没有就替换第一个。若第一个参数不是正则式,则replace()将直接搜索这个串而不进行regexp()转换
match():参数是正则式,返回由匹配结果组成的数组,有g则数组包含所有匹配结果
split():参数是分隔符,将字符串拆分成子串组成的数组
RegExp对象
构造函数有两个参数,第一个为正则式,第二个可选,为修饰符。注意正则式的\需要多一个\进行转义
var a = new RegExp("\\d{5}","g");
RegExp两个方法:
exec():执行模式匹配方法,与String的方法match()类似,但其参数为字符串,无匹配则返回null,否则返回数组。有g需要反复调用exec()获得结果
test():参数为字符串,查看是否包含匹配,返回true或者false
regexp的lastIndex要么找出所有匹配自动置0,否则手动置0,不然影响下一次。