正则表达式之所以强大,是因为其能实现模糊匹配,而模糊匹配,有两个方向上的“模糊”:横向模糊和纵向模糊。
横向模糊匹配
横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。
譬如 {m,n},表示连续出现最少 m 次,最多 n 次。
var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) );
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]
纵向模糊匹配
纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种
可能。
譬如 [abc],表示该字符是可以字符 “a”、”b”、”c” 中的任何一个。
比如 /a[123]b/ 可以匹配如下三种字符串: “a1b”、”a2b”、”a3b”。
var regex = /a[123]b/g;
var string = "a0b a1b a2b a3b a4b";
console.log( string.match(regex) );
// => ["a1b", "a2b", "a3b"]
字符组
虽叫字符组(字符类),但只是其中一个字符,例如 [abc],表示匹配一个字符,它可以是 “a”、”b”、”c” 之一。
范围表示法
如果字符组里的字符特别多的话,可以使用范围表示法。
比如 [123456abcdefGHIJKLM],可以写成 [1-6a-fG-M]。用连字符 - 来省略和简写。
因为连字符有特殊用途,那么要匹配 “a”、”-“、”z” 这三者中任意一个字符,该怎么做呢?
不能写成 [a-z],因为其表示小写字符中的任何一个字符。
可以写成如下的方式:[-az] 或 [az-] 或 [a-z]。
即要么放在开头,要么放在结尾,要么转义。总之不会让引擎认为是范围表示法就行了。
排除字符组
纵向模糊匹配,还有一种情形就是,某位字符可以是任何东西,但就不能是 “a”、”b”、”c”。
此时就是排除字符组(反义字符组)的概念。例如 [^abc],表示是一个除 “a”、”b”、”c”之外的任意一个字
符。字符组的第一位放 ^(脱字符),表示求反的概念。
常见的简写形式
有了字符组的概念后,一些常见的符号我们也就理解了。因为它们都是系统自带的简写形式。
量词
量词也称重复。掌握 {m,n} 的准确含义后,只需要记住一些简写形式。
\/doc_(server¦windows)\/product\/description\
docs/doc_server/product/description.md