括号
作用
提供分组和分支结构
分组和分支结构是括号中的基础使用, 作用是提供一个子表达式分组
使用括号进行分组, 用来表明括号内的所有字符是一个组合, 从而对于括号内的字符组合进行范围限定, 可以对于整个括号添加量词, 表明匹配括号内的元素进行整体量词限定:1  | let str = 'abababc ab';  | 
分支结构
我们在正则中使用| 表明匹配 |  符号左边或者右边的正则, 使用括号包裹| 用来限定 | 的作用范围, 例如:1  | let str = 'ab ac';  | 
在使用 match 的时候,添加全局标识符g加不加是不同的:上面的代码如果不用添加g标识符, 那么返回结果如下:不会进行全局匹配, 只会匹配到ab就会返回。
 1
2
3
4
5 > let str = 'ab ac';
> let regex = /a(b|c)/;
> str.match(regex);
> // ['ab', 'b']
>
分组引用
在正则中使用括号进行包裹正则表达式时, 正则引擎会对于正则表达式进行分组,正则引擎会在匹配过程中, 给每一个分组都开辟一个内存空间, 用来存储每一个分组匹配到的数据。例如, 我们想要对于日期进行匹配:1  | let date = '2019-02-05';  | 
这里使用 match 进行匹配的正则表达式中没有包含有标识符 g, 因此使用 match 与使用 exec 的返回结果是一样的。
符号的优先级
在正则表达式中, 使用操作符进行操作的时候, 需要规定操作符的优先级, 用来表示操作符是谁先操作, 谁后操作, 在正则表达式中, 各种操作符的优先级如下:从上到下:| 描述符 | 操作符 | 
|---|---|
| 转义符 | \ | 
| 括号与方括号 | (...) (?:...) (?=...) (?!...) [...] | 
| 量词限定符 | {m} {m, n} {m, } ?  * + | 
| 位置和序列 | ^  $  \元字符  一般字符 | 
| 管道符 | ` | 
/ab?(c|de*)+|fg/上面的操作过程如下:因为在正则中存在管道符 | 用于分割为 ab?(c|de*)+  和 fg 两个部分, 先执行这两个部分:执行 ab?(c|de*)+: 在这个过程中,先执行括号内的正则, 然后执行字符 a, b ? 以及 +, 在括号内c|de* 的执行顺序中, 先执行 c, de*,  其中 * 是和 e 在一起的, 因此 * 限定的量词是 e;如下:  匹配一个字符串, 字符串中的字符为  a , b, c 中的一个, 并且, 字符串的长度为 3 的倍数;1  | let regexp = /([abc]{3})+/;  | 
1  | /0{0,2}\d+/ // 匹配 000 - 009  | 
1  | /0?\d{2}/  | 
1  | /1\d{2}/ // 匹配 100 - 199  | 
1  | /2[0-4]\d/ // 匹配 200 - 249  | 
1  | /25[0-5]/ // 匹配 250 -255  | 
| 进行连接:1  | (0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])  | 
. 号:1  | /^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.)(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/  | 
\2  进行代替:1  | /^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.)\2$/  |