基础知识
选择符
|
这个符号代表选择修释符,也就是 |
左右两侧有一个匹配到就可以
字符转义
转义用于改变字符的含义,如果想通过正则查找/
符号,但是 /
在正则中有特殊的意义。如果写成///
这会造成解析错误,所以要使用转义语法 /\//
来匹配
字符边界
使用字符边界符用于控制匹配内容的开始与结束约定
^
: 匹配字符串的开始
$
:匹配字符串的结束,忽略换行符
修饰符
i
:ingore case,忽略大小写
g
:global,全局匹配
m
:multi-line,多行匹配
s
:默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 之后, . 中包含换行符 \n
原子表
在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到[]
(方括号)中。
原子表 | 说明 |
---|---|
[] | 只匹配其中的一个原子 |
[^] | 只匹配除了其中字符的任意一个原子 |
[0-9] | 匹配 0-9 任何一个数字 |
[a-z] | 匹配小写 a-z 任何一个字母 |
[A-Z] | 匹配大写 A-Z 任何一个字母 |
[xyz] | 匹配包含 xyz 的任意一个字母 |
[^xyz] | 匹配未包含 xyz 的任意字符 |
元字符
元字符 | 说明 |
---|---|
. | 匹配除换行符外的任意字符 |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\d | 匹配一个数字字符。等价于 [0-9] |
\D | 匹配一个非数字字符。等价于[^0-9] |
\w | 匹配字母、数字、下划线。等价于[A-Za-z0-9_] |
\W | 匹配非字母、数字、下划线。等价于[^a-za-z_] |
\s | 匹配任何空白字符,包括空格、制表符、换页符。等价于 [\f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于[^\n\f\r\t\v] |
\b | 匹配一个单词边界,也就是指单词和空格间的位置 |
\B | 匹配非单词边界 |
所有字符
可以使用 [\s\S]
或 [\d\D]
来匹配所有字符
原子组
如果一次要匹配多个元子,可以通过元子组完成。
原子组与原子表的差别在于原子组一次匹配多个元子,而原子表则是匹配任意一个字符
元字符组用 ()
包裹
重复匹配
符号 | 说明 |
---|---|
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n,m} | 重复 n 到 m 次 |
* | 匹配前一个表达式 0 次或多次。等价于 {0,} |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,} |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1} |
?=n | 匹配任何其后紧接着指定字符串 n 的字符串 |
默认情况下重复选项对单个字符进行重复匹配,即不是贪婪匹配
var str = `abbbbb`,
reg = /ab+/i;
console.log(str.match(reg)); // ["abbbbb", index: 0, input: "abbbbb", groups: undefined]
使用原子组后则对整个组重复匹配
断言匹配
x(?=y)
匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言
(?<=y)x
匹配'x'仅当'x'前面是'y'.这种叫做后行断言
x(?!y)
仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找
(?<!y)x
仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找
贪婪模式和非贪婪模式
正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配。
符号 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复 1 次或更多次,但尽可能少重复 |
?? | 重复 0 次或 1 次,但尽可能少重复 |
{n,m}? | 重复 n 到 m 次,但尽可能少重复 |
{n,}? | 重复 n 次以上,但尽可能少重复 |