JS正则表达式
优先权顺序
从高到底
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
字符类匹配
. 除了换行符和其他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 退格直接量
字符类:锚字符 匹配
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
\A 只有匹配字符串开始处
\b 匹配单词边界,词在 []内时无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处
正则表达式修饰符
字符 含义
i 执行不区分大小写的匹配
g 执行一个全局匹配,即找到所有匹配而非一次匹配
m 多行匹配模式,^匹配一行的开头和字符串开头,$匹配行的结束和字符串的结尾
RegExp 对象常用方法
test():检索字符串中的指定值。返回值是布尔值。
exec():返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用
compile() 既可以改变检索模式,也可以添加或删除第二个参数。
exec()方法
如果匹配返回一个数组,格式如下:
[匹配的文本[,括号匹配的文本(可能多项)] ],属性:匹配到位置下标(index),原始文本(input)]
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec">详见mdn</a>,否则返回null, 然后更新正则表达式的属性,例如lastIndex, 下次匹配的下标。果然不是全局模式"g",lastIndex一直为0;
String 对象中常用正则相关方法
方法 含义
match(pattern) 返回 pattern 中的子串或 null
replace(pattern, replacement) 用 replacement 替换 pattern
search(pattern) 返回字符串中 pattern 开始位置(查找到即返回,没有全局模式) 没有返回-1
split(pattern) 返回字符串按指定 pattern 拆分的数组
match方法
/*使用 match 方法获取匹配数组*/
var pattern = /box/ig;//全局搜索
var str = 'This is a Box!,That is a Box too';
alert(str.match(pattern)); //匹配到两个 Box,Box 全局模式下没有反向应用
console.log(str.match(pattern).length);//获取数组的长度 2
/* 非全局模式下类似exec()返回结果,但只能匹配到第一个, 不会像exec()会更新正则表达式lastIndext
所以以上去掉'g'结果为:
["Box", "B", index: 10, input: "This is a Box!,That is a Box too"] 数组长度为2, 后面是属性
*/
正则表达式转义
\ / [ ] () { } ? + * | . ^ $
需要用\来转义, 表示匹配本身. \前缀不能使字母或数字字面化, 特殊转义:
\f :换页符 \n :换行符 \r :回车符 \t :制表(tab)符
常用的正则表达式
去掉首尾空白
/^\s+ | \s+$/g
匹配中文字符
[\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内)
[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行
\n\s*\r
匹配HTML标记
<(\S*?)[ ^>]*>.*?</\1>|<.*? />
匹配Email地址
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL
[a-zA-z]+://[^\s]*
其他
默认匹配是贪婪匹配,匹配尽可能长的字符串
有?修饰(+?, *?...)匹配尽可能短的字符串
疑惑点
- .+-等一些字符在[]内不用转义