正则表达式
精准匹配
一个字符跟着一个字符,完全匹配
/test/
匹配一类字符
匹配组合中的任意一个👇
[abc]
除了组合中的所有👇
[^abc]
☢️歧义:^有2中含义:在[]中表示“非”,在正则表达式的开头/^abc/,表示匹配以abc开头的字符串。
从a到m之间👇
[a-m]
转义
字母和数字都可以表示自己。但$``-``^可以表达自身以外的东西,要使用反斜杠“\”来转义。
重复
/t?est/👉字符后加?表示一次或零次出现
/t+est/👉+表示一次或多次出现
/t*est/👉 *表示零次或多次出现
/t{4}est/👉{4}表示4次出现
/t{4,10}est/👉{4-10}表示4-10次出现
/t{4,}est/👉{4,}表示4-多次出现
预定义字符
\t表示水平制表符tab
\s表示任何空字符,如空格、tab、回车等
还有很多
分组
操作符(如+``*``?)只能影响它前面的术语。使用小括号()可以使操作符作用于一组术语。
例子:/(ab)+/会匹配"ab"字符串一次或多次。
☢️歧义:()同时还有捕获的作用。
或
使用竖线表示或的关系,比如/a|b/匹配a或b,与/[ab]/类似
反向引用
看这个正则/^([abc])a\1)/,其中()为捕获,可能捕获到a或b或c,\1就表示被捕获到的那个字符。
比如,对于字符串bab,首先([abc])捕获到了b,\1就代表b,所以bab可以匹配。
捕获及捕获的引用
/(hello) (world)/ 在匹配字符串 hello world 时会将 () 中的字符进行捕获,可以用 $1 $2 表示。
在string.replace()中,使用"$1"表示被捕获到的字符。
比如,'hello world'.replace(/(hello) (world)/, '$1 666-$2'),会输出"hello 666-world"
(?: . . .)表示非捕获分组,也就是不会被捕获,仅表示分组。
trim()的实现
方法1
str.replace(/^\s+|\s+$/g,""),在头尾分别替换掉空字符
方法2
var str = strings.replace(/^\s\s*/,""), //在头部替换
ws = /\s/,
i = str.length;
while(ws.test(str.charAt(--i))); // 看在尾部有几个空字符
return str.slice(0,i+1); // 剔除空字符
方法2比方法1在长文档中性能更好。
其他
匹配换行符
- 术语点
.不能匹配到换行符\n /\s*/g匹配不到连续多个空字符,可以用/\s+/g可以。