原文链接: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) ); // 也是匹配 +,-
(完)