匹配规则
一、字面量字符
大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a和b),那么它们就叫做“字面量字符”
/dog/.test('old dog') // true
上面代码中正则表达式的dog,就是字面量字符,所以/dog/匹配old dog,因为它就表示d、o、g三个字母连在一起。
二、元字符
除了字面量字符以外,还有一部分字符有特殊含义,不代表字面的意思。它们叫做“元字符”(metacharacters),主要有以下几个。
- 点字符(.)
点字符(.)匹配除回车( )、换行( ) 、行分隔符(u2028)和段分隔符(u2029)以外的所有字符。注意,对于码点大于0xFFFF的 Unicode 字符,点字符不能正确匹配,会认为这是两个字符。
/c.t/
上面代码中,c.t匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot
- 位置字符
位置字符用来提示字符所处的位置,主要有两个字符。
^ 表示字符串的开始位置
$ 表示字符串的结束位置
test必须出现在开始位置
/^test/.test('test123') // true
test必须出现在结束位置
/test$/.test('new test') // true
从开始位置到结束位置只有test
/^test$/.test('test') // true
/^test$/.test('test test') // false
- 选择符(|)
竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog。
正则表达式指定必须匹配11或22。
/11|22/.test('911') // true
多个选择符可以联合使用。 匹配fred、barney、betty之中的一个
/fred|barney|betty/
选择符会包括它前后的多个字符,比如/ab|cd/指的是匹配ab或者cd,
而不是指匹配b或者c。如果想修改这个行为,可以使用圆括号。
/a( | )b/.test('a b') // true
上面代码指的是,a和b之间有一个空格或者一个制表符。
其他的元字符还包括\、*、+、?、()、[]、{}等,将在下文解释。
表示 a d之间有 个 b 或者 c;
/a(b|c)d/.test('acd');
三、转义符
正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠。比如要匹配+,就要写成+。
/1+1/.test('1+1') // false;
/1+1/.test('1+1') // true;
上面代码中,第一个正则表达式之所以不匹配,因为加号是元字符,不代表自身。
第二个正则表达式使用反斜杠对加号转义,就能匹配成功。
正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和。需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。
(new RegExp('1+1')).test('1+1') // false
(new RegExp('1\+1')).test('1+1') // true
上面代码中,RegExp作为构造函数,参数是一个字符串。
但是,在字符串内部,反斜杠也是转义字符,所以它会先被反斜杠转义一次,然后再被正则表达式转义一次,
因此需要两个反斜杠转义。
四、特殊字符
正则表达式对一些不能打印的特殊字符,提供了表达方法。
- cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。
- [] 匹配退格键(U+0008),不要与混淆。
- 匹配换行键。
- 匹配回车键。
- 匹配制表符 tab(U+0009)。
- v 匹配垂直制表符(U+000B)。
- f 匹配换页符(U+000C)。