JavaScript 正则表达式教程:字符集合与范围匹配
什么是字符集合
在正则表达式中,方括号 [...]
表示一个字符集合,它告诉正则引擎"匹配其中任意一个字符"。这是正则表达式中最基础也最实用的功能之一。
基础用法示例
比如 [eao]
表示匹配字母 'a'、'e' 或 'o' 中的任意一个。这种集合可以和其他正则表达式元素组合使用:
// 匹配 t 或 m,后面跟着 op
console.log("Mop top".match(/[tm]op/gi)); // 输出 ["Mop", "top"]
重要提示:虽然集合中包含多个字符,但它每次只匹配一个字符。例如:
// 匹配 V,然后 o 或 i,然后 la
console.log("Voila".match(/V[oi]la/)); // null,没有匹配项
这个模式会匹配 "Vola" 或 "Vila",但不会匹配 "Voila",因为中间的 [oi]
只能匹配一个字符。
字符范围表示法
方括号内还可以使用连字符 -
来表示字符范围,这大大简化了连续字符的表示。
常见范围示例
[a-z]
:任意小写字母[A-Z]
:任意大写字母[0-9]
:任意数字[a-zA-Z]
:任意字母(大小写都包括)
// 匹配 x 后跟两个十六进制数字(0-9或A-F)
console.log("Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g)); // ["xAF"]
范围组合技巧
如果需要同时匹配大小写字母,可以:
- 添加
a-f
范围:[0-9A-Fa-f]
- 或者使用
i
标志忽略大小写
字符类与集合的结合
正则表达式的预定义字符类(如 \w
、\d
等)也可以用在集合中:
[\w-]
:匹配单词字符或连字符[\s\d]
:匹配空白字符或数字
字符类本质:
\d
等价于[0-9]
\w
等价于[a-zA-Z0-9_]
\s
等价于[\t\n\v\f\r ]
等空白字符
多语言支持方案
标准的 \w
只支持拉丁字母,对于中文、西里尔字母等需要特殊处理:
const regexp = /[\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]/gu;
console.log("Hi 你好 12".match(regexp)); // ["H", "i", "你", "好", "1", "2"]
这个模式使用了 Unicode 属性:
\p{Alpha}
:字母\p{M}
:音调符号\p{Nd}
:数字\p{Pc}
:连接标点(如下划线)\p{Join_C}
:连接控制字符
排除范围匹配
在集合开头使用 ^
可以创建"排除"集合,匹配不在指定范围内的字符:
[^aeyo]
:除了 a、e、y、o 之外的字符[^0-9]
:非数字,等价于\D
[^\s]
:非空白字符,等价于\S
// 匹配非字母、数字和空白的字符
console.log("alice15@gmail.com".match(/[^\d\sA-Z]/gi)); // ["@", "."]
特殊字符转义规则
在字符集合中,大多数特殊字符不需要转义:
- 通常不需要转义的字符:
. + ( )
- 连字符
-
在开头或结尾时不需转义 - 脱字符
^
只在开头需要转义(表示排除) - 右方括号
]
必须转义
// 两种写法等效
const regexp1 = /[-().^+]/g;
const regexp2 = /[\-\(\)\.\^\+]/g;
console.log("1 + 2 - 3".match(regexp1)); // ["+", "-"]
Unicode 与代理对处理
当处理包含代理对的 Unicode 字符(如一些特殊符号)时,必须使用 u
标志:
// 错误示例:没有 u 标志
console.log('𝒳'.match(/[𝒳𝒴]/)); // 错误匹配
// 正确示例:使用 u 标志
console.log('𝒳'.match(/[𝒳𝒴]/u)); // 正确匹配 "𝒳"
原因:没有 u
标志时,引擎会将代理对拆分成两个字符处理,导致匹配错误。范围匹配时同样需要注意这个问题:
// 错误示例:缺少 u 标志
// '𝒳'.match(/[𝒳-𝒴]/); // 报错:无效的正则表达式
// 正确示例
console.log('𝒴'.match(/[𝒳-𝒵]/u)); // 正确匹配 "𝒴"
总结
字符集合和范围是正则表达式中非常强大的功能,掌握它们可以:
- 简洁地表示多个可能的匹配字符
- 方便地定义字符范围
- 灵活组合各种字符类和特殊字符
- 处理多语言文本匹配需求
- 实现排除特定字符的匹配
记住在处理 Unicode 特殊字符时使用 u
标志,这是避免常见匹配错误的关键。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考