匹配字符规则:
. 通配符,匹配除换行符外的所有字符
\d 匹配数字,同[0-9]
\D 非数字
[a-z] 匹配小写字母
[A-Z] 匹配大写字母
\s 匹配任意空白字符
\S 匹配任意非空白字符,和\s相反
\w 匹配任意字类字符和_,同[a-zA-Z0-9_]
\W 好\w相反
\b 单词开始和结束位置
[] 多选匹配,可匹配[]中所有字符
[^] 不匹配[]中所有字符(如/^[^1]$/.test(1) == false)
| 或选项,可匹配|之前或之后的部分,配合()限制作用域
^ 匹配字符串开头位置
$ 匹配字符串结束位置,和^一起使用表示精确匹配
匹配数量规则:
* 匹配任意数量字符
+ 匹配1到多个字符
? 匹配0到1个字符
{x,y} 匹配x-y个字符,y不存在时无上限
{x} 匹配x个字符
创建方法:
字面量:包含在//之间,如/\d*/
通过new生成:new RegExp(‘\d*’);或new RegExp(/\d*/) 返回结果也是/\d*/
匹配模式规则:
g: 匹配所有字符
i: 不区分大小写匹配
u: 识别unicode字符(es6)
y: 每次匹配会修改lastIndex,导致下次匹配从上次匹配结束位置开始(es6)
贪婪匹配:
默认状态就是贪婪匹配,总是匹配尽可能多的字符
而非贪婪匹配,在之后加一个?,匹配尽可能少的字符
/\w+/.exec('123ad'); //['123ad'] /\w+?/.exec('123ad'); //['1']
正则子作用域:
使用()可以在正则表达式中添加子作用域,可以修改正则元算符和匹配符的作用范围;
例:/(az)+/匹配azazaz...而不是azzzzzz
/a(abc|123)/匹配aabc或a123而不是aabc或123
保存变量:
例:/(abc)d/.test(’abcd’)会把abc保存到RegExp.$1中
常用替换字符串特定字符:
'1234'.replace(/\d/g, '$1s'); //1s2s3s4s
ps:$1代表第一个匹配到的参数,$2代表第二个。。。依次类推
正则预查:
正则中我们可以使用预查来筛选特性的字符,不过比较可惜的是js只支持向后预查
(?=str)匹配后面跟着str字符串的部分
(?!str)匹配后面没有str字符串的部分
'1_2$34a'.replace(/\d(?=[a-z])/g, 'h'); //"1_2$3ha" '1_2$34a'.replace(/\d(?![a-z])/g, 'h'); //"h_h$h4a"
Ps:在进行匹配时,不会吧预查部分内容匹配出来,我们使用replace的时候也不会对预查部分进行替换
正则方法:
exec:用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null
test:返回一个bool值,判断是否满足匹配条件
/\d/.exec('123456'); //['1'] /\d/.test('123456'); //true
字符串方法:
split :按照参数提供规则切割字符串,返回相应数组,第二个参数可指定数组最大长度
match:和exec匹配一样,不过匹配所有的值返回
search:返回匹配值的位置
replace:
替换匹配到的字符串,第二个参数字符串时:
$$插入一个$
$&插入匹配的子串
$`插入匹配子串左侧内容
$’插入匹配子串右侧内容
$n插入匹配到的第n个子串
如果第二个参数是function:
第一个参数是匹配字符
2-n:相当于$n
倒数第二个参数:偏移量
最后一个参数:源字符串
'123456'.match(/\d/g); //["1", "2", "3", "4", "5", "6"] 'a123456'.search(/\d/); //1 '192.168.1.1'.replace(/\d+/g, 'a'); //"a.a.a.a" '192.168.1.1'.replace(/(\d+)/g, '$1a'); //"192a.168a.1a.1a" '192.168.1.1'.replace(/(\d+)/g, (arg) => arg + 'a'); //"192a.168a.1a.1a" '192.168.1.1'.replace(/(\d+)/g, (arg, arg1) => arg1 + 'a'); //"192a.168a.1a.1a" '1 2 3 4'.split(' '); //["1", "2", "3", "4"] '1 2 3 4'.split(' ', 2); //["1", "2"] '1 2 3 4'.split(' ', 10); //["1", "2", "3", "4"]
最后,写一个关于ipv4地址的正则匹配规则:
0-255.0-255.0-255.0-255
每个数字都是0-255
正则表达式:/(25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)/
25[0-5]匹配250-255之间数字
2[14]\d匹配200-249之间数字
1\d{2}匹配100-199之间数字
[1-9]\d匹配10-99之间数字
\d匹配0-9之间数字
然后我们重复组装:
/^((25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)$/
至此就算匹配成功