内容参考:JavaScript权威指南
1.修饰符
修饰符是放在"/"符号之外的
字符 含义 i 执行不区分大小写的匹配 g 执行一个全局匹配(默认的是找到第一个即停止) m 多行匹配模式,此模式下,^匹配行首,$匹配行尾
2.直接量匹配
2.字符类匹配[]
字符 匹配 […] 方括号内的任意字符 [^…] 不在方括号内的任意字符 . 除换行符和其他Unicode行终止符之外的任意字符 \d 等价于[0-9] \D 等价于[^0-9] \w 等价于[a-zA-Z0-9] \W 等价于[^a-zA-Z0-9] \s 任何Unicode空白符 \S 任何非Unicode空白符的字符 [\b] 退格直接量
3.重复匹配{}
字符 含义 {n} 匹配前一项n次 {n,} 匹配前一项至少n次 {n,m} 匹配前一项 [n,m] 次 ? 等价于{0,1} + 等价于{1,} * 等价于{0,}
/ \s+ java\s+ / 匹配前后带有一个或多个空格的字符串'java'
非贪婪的重复匹配
1. 输入:aaa 规则:/ a+ / 输出:aaa 匹配到第一个a即满足匹配规则,但它会继续往下尝试匹配(贪婪),输出aaa
2. 输入:aaa 规则:/ a+ ? / 输出:a 匹配到第一个a即满足匹配规则,匹配结束(一个就饱了,不贪婪),输出第一个a
3. 输入:aaab 规则:/ a+ b/ 输出:aaab
4. 输入:aaab 规则:/ a+ ?b/ 输出:aaab 匹配到第一个a而后寻找到b后才满足匹配规则,和例3 一样,输出第一个匹配结果aaab。
5. 输入:aaabb 规则:/ a+ b+ ? / 输出:aaabb
6. 输入:aaabb 规则:/ a+ b+ ? / 输出:aaab 匹配到aaab后满足规则,不向后贪婪匹配那个b,输出aaab
结论:在没有匹配成功前,无所谓贪婪不贪婪,也即非贪婪的重复匹配符号得放在正则表达式末尾才有意义。
5.位置匹配
字符 含义 ^ 匹配开头 $ 匹配结尾 \b 匹配一个单词的边界(\w与\W之间的位置或字符\w和字符串开头/结尾之间的位置) \B 匹配非单词边界的位置 … …
6.选择、分组和引用
字符 含义 | 选择,匹配的是该符号左边的子表达式或右边的子表达式 (pattern) / (?:pattern) 捕获 / 非分组,将几个项组合为一个单元,该部分记录 / 不记录引用(引用项,后续可以使用 \数字方式引用结果) (?=pattern)、(?<=pattern) 正 / 反向肯定预查,匹配以pattern开头 / 结尾的正则,该部分不会出现在匹配结果中,不记录引用 (?!pattern)、(?<!pattern) 正 / 反向否定预查,匹配不以pattern开头/结尾的正则,该部分不会出现在匹配结果中,不记录引用 … …
1.输入:abcb 规则:/(a(b))(c)\2/ 输出:abcb 1证:引用的位置是参与计数的左括号的位置,(?:xxx)分组用的左括号不计
2.输入:' a " b " ' 规则:/['"][^'"]*['"]/ 输出:' a "
3.输入:' a " b " ' 规则:/(['"])[^'"]*\1/ 输出:' a " b " ' 23证:引用的是正则表达式模式匹配后的文本,不是正则表达式模式。
4.输入:' a " b " ' 规则:/(['"])[^\1]*\1/ 输出:错误(此种引用不能在字符类中使用)