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

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

ru.javascript.info Современный учебник JavaScript ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

什么是字符集合

在正则表达式中,方括号[...]用于定义字符集合,表示"匹配其中任意一个字符"。例如,[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) ); // 输出 𝒴

总结

字符集合和范围是正则表达式中强大的功能,可以:

  1. 匹配一组特定字符
  2. 定义字符范围
  3. 排除特定字符
  4. 支持多语言字符匹配
  5. 结合Unicode属性处理复杂场景

掌握这些技巧可以大幅提升正则表达式的灵活性和表达能力。

ru.javascript.info Современный учебник JavaScript ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

牧韶希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值