原文链接:https://javascript.info/regexp-character-sets-and-ranges,translate with ❤️ by zhangbao.

在方括号 [...] 里的一些字符或者字符类,表示”搜索这些范围里的任意一个字符”。

集合

例如,[eao] 表示这三个字符里的任意一个:’e‘、’a‘ 或者 ‘0‘。

这称为一个集合。集合可以和常规字符一起在正则表达式里使用:

  1. // 查找 [t 或者 m],和 'op'
  2. alert( 'Mop top'.match(/[tm]op/gi) ); // "Mop", "top"

注意,虽然在集合中有多个字符,它们只确认匹配其中的一个字符。

所以下面的例子没有匹配项:

  1. // 查找 'V',然后是 [o 或者 i],然后是 'la'
  2. alert( 'Voila'.match(/V[oi]la/) ); // null。没有找到匹配项。

模式认为:

  • V,

  • [oi] 中其中一个字符,

  • 然后是 la

所以匹配结果只可能是 Vola 或者 Vila

范围

方括号也可以包含 字符范围

例如,[a-z] 表示从 az 的字符范围,[0-5] 表示从 05 的数字范围。

下面例子里,我们查找”x“后面跟两个数字或者从 AF 范围间的两个字符:

  1. alert( 'Exception 0xAF'.match(/x[0-9A-F][0-9A-F]/g) ); // xAF

注意在 Exception 里包含一个字符串 xce,没有匹配是因为字母是小写的,而 [0-9A-F] 查找的是大写的形式。

如果也想找小写的,我们我们可以添加范围 a-f[0-9A-Fa-f]。当然使用 i 标记允许小写形式也 OK。

字符类其实是某个字符集合的简写形式。

例如:

  • \d —— 等同于 [0-9]

  • \w —— 等同于 [a-zA-Z0-9_]

  • \s —— 等同于 [\t\n\v\f\r] 加上一些其他的 Unicode 空格字符。

我们也可以在 [...] 中使用字符类。

例如,比如我们要匹配所有的单词字符,可以但连字符的,类似”twenty-third”这样的。我们不能用 \w+,因为 \w 集合里不包含连字符。但是我们可以使用 [\w-]

我们还可以使用组合来涵盖所有可能的字符,像 [\s\S]。匹配空格或非空格字符,即任何字符。这个范围比点”.“的范围还大,因为点是匹配除了换行符之外的任意字符。

除外范围

除了正常范围,还有”除外”范围,写作 [^...]

用插入符 ^ 表示,写在开头,匹配 给定范围之外 的任何字符。

例如:

  • [^aeyo] —— 除 ‘a‘、’e‘、’y‘ 或者 ‘o‘ 之外的任意字符。

  • [^0-9] —— 除数字之外的任意字符,等同于 \D

  • [^\s] —— 表示非空格字符,等同于 \S

下面例子里,查找所有除字母、数字和空格之外的所有字符:

  1. alert( 'alice15@gmail.com'.match(/[^\d\sA-Z]/gi) ) // ["@", "."]

在 […] 中无需转义的字符

通常当我们想要找点字符时,我们需要用转义字符 \.;如果想要查找的是反斜线,那么就要用 \\

在方括号中,绝大多数的特殊字符都可以不被转义:

  • 点”.“,

  • 加”+“,

  • 圆括号”( )“,

  • 在开头和结尾处的连字符”-“(在这些地方不表示范围),

  • 不在开头的插入符”^“(开头的表示是排除),

  • 在开头的方括号”[“。

也就是说,排除那些在方括号里有特殊含义的字符,其他的特殊字符都可以不转义。

方括号里的”.“就表示点,模式 [.,] 查找的是字符串里的一个点或者一个逗号。

在下面的例子里,正则表达式 [-().^+] 查找 -().^+ 中的任意一个字符:

  1. // 无需转义
  2. let reg = /-().^+/g;
  3. alert( '1 + 2 - 3'.match(reg) ); // 匹配到 +,-

但是如果你”以防万一”的决定转义,当然也可以:

  1. // 转义任何事
  2. let reg = /[\-\(\)\.\^\+]/g;
  3. alert( '1 + 2 + 3'.match(reg) ); // 也是匹配 +,-

(完)