JavaScript正则表达式教程:字符集合与范围匹配
什么是字符集合
在正则表达式中,方括号[...]
用于定义字符集合,表示"匹配其中任意一个字符"。例如,[eao]
可以匹配字母'a'
、'e'
或'o'
中的任意一个。
基础示例
// 匹配"т"或"х"后面跟着"оп"
alert( "Топ хоп".match(/[тх]оп/gi) ); // 输出 "Топ", "хоп"
需要注意的是,一个字符集合只匹配一个字符。例如,正则表达式В[уа]ля
可以匹配"Вуля"或"Валя",但不会匹配"Вуаля",因为[уа]
只匹配一个字符。
字符范围
方括号内还可以定义字符范围,使用连字符-
表示连续的范围:
[a-z]
:匹配任意小写字母[A-Z]
:匹配任意大写字母[0-9]
:匹配任意数字
组合范围示例
// 匹配"x"后跟两个十六进制字符(数字或A-F)
alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); // 输出 xAF
可以组合多个范围和字符类,例如[\w-]
匹配单词字符或连字符,[\s\d]
匹配空白字符或数字。
字符类的本质
常见的字符类实际上是预定义的字符集合简写:
\d
等价于[0-9]
\w
等价于[a-zA-Z0-9_]
\s
等价于[\t\n\v\f\r ]
(包含各种空白符)
多语言支持
标准的\w
只支持拉丁字母,要支持其他语言如中文、俄语等,可以使用Unicode属性:
let regexp = /[\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]/gu;
let str = `Hi 你好 12`;
alert( str.match(regexp) ); // 输出 H,i,你,好,1,2
这个模式使用了以下Unicode属性:
Alpha
:字母M
:音调符号Nd
:数字Pc
:连接标点(如下划线)Join_C
:连接控制字符
排除型字符集合
在集合开头使用^
表示"排除这些字符":
[^aeyo]
:匹配除a、e、y、o外的任意字符[^0-9]
:等价于\D
,匹配非数字[^\s]
:等价于\S
,匹配非空白符
排除示例
// 匹配非字母、数字和空白符的字符
alert( "alice15@gmail.com".match(/[^\d\sA-Z]/gi) ); // 输出 @ 和 .
特殊字符转义规则
在字符集合中,大多数特殊字符不需要转义:
. + ( )
永远不需要转义-
只在集合中间需要转义(当表示范围时)^
只在开头需要转义(当表示排除时)]
必须转义
// 两种写法都有效
let regexp1 = /[-().^+]/g;
let regexp2 = /[\-\(\)\.\^\+]/g;
alert( "1 + 2 - 3".match(regexp1) ); // 输出 +, -
Unicode与u标志
处理Unicode字符(特别是代理对)时,必须使用u
标志:
// 错误示例(没有u标志)
alert( '𝒳'.match(/[𝒳𝒴]/) ); // 错误匹配
// 正确示例
alert( '𝒳'.match(/[𝒳𝒴]/u) ); // 正确匹配 𝒳
没有u
标志时,引擎会将代理对视为两个独立字符,导致匹配错误。同样,Unicode字符范围也需要u
标志:
// 匹配从𝒳到𝒵的字符
alert( '𝒴'.match(/[𝒳-𝒵]/u) ); // 输出 𝒴
总结
字符集合和范围是正则表达式中强大的功能,可以:
- 匹配一组特定字符
- 定义字符范围
- 排除特定字符
- 支持多语言字符匹配
- 结合Unicode属性处理复杂场景
掌握这些技巧可以大幅提升正则表达式的灵活性和表达能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考