[0-9A-F]
中有两个范围:它搜索一个字符,该字符要么是在
0
到
9
范围内的数字,要么是从
A
到
F
的字母。
如果我们还想查找小写字母,则可以添加范围
a-f
:
[0-9A-Fa-f]
。或添加标志
i
。
我们也可以在
[…]
中使用字符类。
例如,如果我们想查找单词字符
\w
或连字符
-
,则集合可以写为
[\w-]
。
也可以组合多个类,例如
[\s\d]
表示“空格字符或数字”。
\d
—— 和
[0-9]
相同,
\w
—— 和
[a-zA-Z0-9_]
相同,
\s
—— 和
[\t\n\v\f\r ]
外加少量罕见的 Unicode 空格字符相同。
由于字符类
\w
是简写的
[a-zA-Z0-9_]
,因此无法找到中文象形文字,西里尔字母等。
我们可以编写一个更通用的模式,该模式可以查找任何语言中的单词字符。借助 Unicode 属性很容易实现:
[\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]
。
让我们理解一下。类似于
\w
,我们正在制作一组属于我们自己的包含具有以下 Unicode 属性的字符:
Alphabetic
(
Alpha
) —— 字母,
Mark
(
M
) —— 音调,
Decimal_Number
(
Nd
) —— 数字,
Connector_Punctuation
(
Pc
) —— 下划线
'_'
和类似的字符,
Join_Control
(
Join_C
) —— 两个特殊代码
200c
和
200d
,用于连字,例如阿拉伯语。
使用示例:
当然,我们可以编辑这个模式:添加 Unicode 属性或删除它们。
Unicode:修饰符 "u" 和类 \p{...}
一文更详细地介绍了 Unicode 属性。
IE 浏览器未实现 Unicode 属性
p{...}
。如果我们真的需要它们,可以使用库
XRegExp
。
或者只是使用我们感兴趣的语言中的字符范围,例如西里尔字母范围
[а-я]
。
除了普通的范围匹配,还有像这样
[^…]
的“排除”范围匹配。
通过在开头添加插入符号
^
来表示匹配所有
除了给定的字符
之外的任意字符。
[^aeyo]
—— 匹配除了
'a'
、
'e'
、
'y'
或
'o'
之外的任何字符。
[^0-9]
—— 匹配除了数字之外的任何字符,与
\D
作用相同。
[^\s]
—— 匹配任何非空格字符,与
\S
作用相同。
下面的示例搜索除了字母、数字和空格之外的任何字符:
通常当我们想要准确地找到一个特殊字符时,我们需要像
\.
这样对其进行转义。如果我们需要反斜杠,那么我们需要使用
\\
,等等。
在方括号,我们可以使用绝大多数特殊字符而无需转义:
符号
. + ( )
无需转义。
在开头或结尾(未定义范围)的连字符
-
不会被转义。
插入符号
^
仅在开头会被转义(表示排除)。
右方括号
]
总是会被转义(如果我们需要寻找那个符号)。
换句话说,除了在方括号中有特殊含义的字符外,其它所有特殊字符都是允许不转义的。
方括号中的点
.
表示的就是一个点。模式
[.,]
将会搜索字符之一:点或逗号。
在下面的示例中,正则表达式
[-().^+]
查找
-().^+
中的任何字符:
for(let i=0; i<'𝒳𝒴'.length; i++) {
alert('𝒳𝒴'.charCodeAt(i)); // 55349, 56499, 55349, 56500
因此,上面的示例查找并显示了 𝒳
的左半部分。
如果我们添加了修饰符 u
,那么行为就正常了:
因为,没有修饰符 u
时,代理对将被视为两个字符,所以 [𝒳-𝒴]
被理解为 [<55349><56499>-<55349><56500>]
(每个代理对都替换为其代码)。现在很容易看出范围 56499-55349
是无效的:其起始代码 56499
大于终止代码 55349
。这就是错误的原因。
带有修饰符 u
时,该模式就可以正常匹配了: