JavaScript 正则表达式教程:字符集合与范围匹配

JavaScript 正则表达式教程:字符集合与范围匹配

en.javascript.info Modern JavaScript Tutorial en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

什么是字符集合

在正则表达式中,方括号 [...] 表示一个字符集合,它告诉正则引擎"匹配其中任意一个字符"。这是正则表达式中最基础也最实用的功能之一。

基础用法示例

比如 [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"]

范围组合技巧

如果需要同时匹配大小写字母,可以:

  1. 添加 a-f 范围:[0-9A-Fa-f]
  2. 或者使用 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)); // 正确匹配 "𝒴"

总结

字符集合和范围是正则表达式中非常强大的功能,掌握它们可以:

  1. 简洁地表示多个可能的匹配字符
  2. 方便地定义字符范围
  3. 灵活组合各种字符类和特殊字符
  4. 处理多语言文本匹配需求
  5. 实现排除特定字符的匹配

记住在处理 Unicode 特殊字符时使用 u 标志,这是避免常见匹配错误的关键。

en.javascript.info Modern JavaScript Tutorial en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏雅瑶Winifred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值