原文链接:https://javascript.info/regexp-character-sets-and-ranges,translate with ❤️ by zhangbao.
在方括号 [...] 里的一些字符或者字符类,表示”搜索这些范围里的任意一个字符”。
集合
例如,[eao] 表示这三个字符里的任意一个:’e‘、’a‘ 或者 ‘0‘。
这称为一个集合。集合可以和常规字符一起在正则表达式里使用:
// 查找 [t 或者 m],和 'op'alert( 'Mop top'.match(/[tm]op/gi) ); // "Mop", "top"
注意,虽然在集合中有多个字符,它们只确认匹配其中的一个字符。
所以下面的例子没有匹配项:
// 查找 'V',然后是 [o 或者 i],然后是 'la'alert( 'Voila'.match(/V[oi]la/) ); // null。没有找到匹配项。
模式认为:
V,
[oi]中其中一个字符,然后是
la。
所以匹配结果只可能是 Vola 或者 Vila。
范围
方括号也可以包含 字符范围。
例如,[a-z] 表示从 a 到 z 的字符范围,[0-5] 表示从 0 到 5 的数字范围。
下面例子里,我们查找”x“后面跟两个数字或者从 A 到 F 范围间的两个字符:
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。
下面例子里,查找所有除字母、数字和空格之外的所有字符:
alert( 'alice15@gmail.com'.match(/[^\d\sA-Z]/gi) ) // ["@", "."]
在 […] 中无需转义的字符
通常当我们想要找点字符时,我们需要用转义字符 \.;如果想要查找的是反斜线,那么就要用 \\。
在方括号中,绝大多数的特殊字符都可以不被转义:
点”
.“,加”
+“,圆括号”
( )“,在开头和结尾处的连字符”
-“(在这些地方不表示范围),不在开头的插入符”
^“(开头的表示是排除),在开头的方括号”
[“。
也就是说,排除那些在方括号里有特殊含义的字符,其他的特殊字符都可以不转义。
方括号里的”.“就表示点,模式 [.,] 查找的是字符串里的一个点或者一个逗号。
在下面的例子里,正则表达式 [-().^+] 查找 -().^+ 中的任意一个字符:
// 无需转义let reg = /-().^+/g;alert( '1 + 2 - 3'.match(reg) ); // 匹配到 +,-
但是如果你”以防万一”的决定转义,当然也可以:
// 转义任何事let reg = /[\-\(\)\.\^\+]/g;alert( '1 + 2 + 3'.match(reg) ); // 也是匹配 +,-
(完)
