正则表达式
精准匹配
一个字符跟着一个字符,完全匹配
/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
可以。