(1) 正则表达式语法:
1. 原子:常规
① 特殊字符
下面所有的字符都有特殊的意义:
^ $ . * + ? ( ) [ ] { } |
② 模式字符
除了上述的一些特殊字符,所有字符都匹配它们自身。
③ 点(.)
匹配任意的JavaScript字符(UTF-16编码单元),除了行结束符(回车符、换行符等)。要真正匹配任何字符,请使用[sS]。例如:
var a = /[sS]/.test(' '); console.log(a); // true
④ 字符转义(匹配单个字符)
● 特殊的控制字符包括f(翻页符), (换行符), (回车符), (水平制表符),v(垂直制表符)
● 匹配NUL字符(U0000)
● 任何控制字符:cA~xZ
● Unicode字符转义:u0000~xFFFF
● 十六进制字符转义:x00~xFF
⑤ 字符分类转义(匹配字符集合中的一个字符)
● 数字: d 匹配任意数字(同[0-9]);D 匹配任何非数字(同[^0-9])。
● 字母数字字符: w 匹配任意拉丁文字母数字和下划线(同[A-Za-z0-9_]);W 匹配所有w不匹配的字符。
● 空格: s 匹配空白字符(空格、制表符、换行符、回车符、翻页符和所有Unicode空格等);S 匹配所有非空白字符。
2. 原子: 字符类
字符类的语法如下(《》表示内部是一个代码):
● [《charSpecs》] 至少匹配charSpecs中的任意一个字符。
● [^《charSpecs》] 匹配不属于charSpecs中的任意一个字符。
所有字符的匹配规范如下:
① 源字符与自身匹配。大多数字符都会源字符。只有3个不是源字符: ] -。通常你可以通过反斜杠转义
② 分类转义:前面列出的任何字符转义和字符分类转义都是允许的。
③ 范围包括源字符或分类字符,后面跟随者一个连接符(-),之后接着源字符或分类转义。
3. 原子: 分组
● (《pattern》)是捕获组。任何匹配pattern的内容都可以通过反向引用访问或作为匹配操作的结果。
● (?:《pattern》)是非捕获组。pattern仍旧匹配输入,但不保存捕获的内容。因此,这种分组没有数字可以引用。
4. 量词
量词可以跟随在任何原子(包括字符类和分组)后。
? 表示从未匹配或只匹配一次。
* 表示匹配零次或多次。
+ 表示匹配一次或多次。
{n} 表示完全匹配n次。
{n,} 表示匹配n次或多次。
{n,m} 表示匹配最少n次,最多匹配m次。
5. 断言
下面的断言,用来检测输入的当前位置。
^ 只匹配输入的开始位置。
$ 只匹配输入的结束位置。
只匹配单词的边界。不要与[]混淆,它匹配一个退格。
B 只匹配非单词边界。
(?=《pattern》) 正向肯定断言:只匹配pattern所匹配的接下来的内容。pattern只是用来向前查找,但会忽略匹配的pattern部分。
(?!《pattern》) 正向否定断言:只匹配pattern不匹配的接下来的内容。pattern只是用来向前查找,但会忽略匹配的pattern部分。
6. 析取(或)
析取运算符(|)分离两个选择方案;必须匹配其中一个方案。
析取操作符结合很弱,所以你必须小心,选择的方案不会拓展得太长。换句话说,析取操作符甚至比^和$结合更弱。
(2) 标识
g 给定的正则表达式可以匹配多次,他会影响几种方法,尤其是replace()
i 试图匹配给定的正则表达式时忽略大小写
m 在多行模式中,开始操作符^和结束操作符$匹配每一行,而不是输入的整个字符串。
(3) 实例方法
1. RegExp.prototype.test(): 是否存在匹配
test()方法用来检查正则表达式是否匹配字符串str。
2. String.pototype.search(): 匹配位置的索引
如果存在匹配,返回发现匹配位置的索引。否则,返回值是-1。
3. RegExp.prototype.exec(): 捕获分组
不设置/g: 只捕获第一次匹配的分组(调用一次)。
设置/g: 捕获所有匹配的分组(重复调用;如果没有任何匹配,返回null)。
4. String.prototype.match(): 捕获分组或返回所有匹配的子字符串
不设置/g: 捕获分组。
设置/g: 返回所有匹配的子字符串的数组。
5. String.prototype.replace():查找和替换