正则表达式之所以强大,是因为其能实现模糊匹配,而模糊匹配,有两个方向上的“模糊”:横向模糊和纵向模糊。

横向模糊匹配

横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。
譬如 {m,n},表示连续出现最少 m 次,最多 n 次。

  1. var regex = /ab{2,5}c/g;
  2. var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
  3. console.log( string.match(regex) );
  4. // => ["abbc", "abbbc", "abbbbc", "abbbbbc"]

纵向模糊匹配

纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种
可能。
譬如 [abc],表示该字符是可以字符 “a”、”b”、”c” 中的任何一个。
比如 /a[123]b/ 可以匹配如下三种字符串: “a1b”、”a2b”、”a3b”。

  1. var regex = /a[123]b/g;
  2. var string = "a0b a1b a2b a3b a4b";
  3. console.log( string.match(regex) );
  4. // => ["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”之外的任意一个字
符。字符组的第一位放 ^(脱字符),表示求反的概念。

常见的简写形式

有了字符组的概念后,一些常见的符号我们也就理解了。因为它们都是系统自带的简写形式。
image.png

量词

量词也称重复。掌握 {m,n} 的准确含义后,只需要记住一些简写形式。
image.png

\/doc_(server¦windows)\/product\/description\

docs/doc_server/product/description.md