【JavaScript正则表达式指南】——字符类(集合、范围、预定义字符类)和反向字符类详解

摘要 本文介绍正则表达式中字符类及其应用,包括基础集合、范围表示、预定义字符类(如 \d、\w、\s)及其反向形式,字符类用方括号定义匹配集合,范围用连字符简化连续字符表示,预定义类提供常用集合快捷方式,反向类通过脱字符 ^ 实现否定匹配。

字符类

字符类:又称字符集合。用方括号[]包裹,定义"匹配任意一个括号内字符"的柜子,本质是对多个可选字符的统一描述。

集合

在正则表达式中,用方括号[]括起一组字符可形成字符集合是字符类的基础表达形式,用于匹配字符串中对应位置上的任意一个字符,只要该字符属于这个集合。例如/[abc]/,就能够匹配a、b或c中的任意一个字符。

js 复制代码
let str='app aop asp amp'
let reg=/a[pos]p/g//匹配a某p形式的字符串 中间字符存在在集合[pos]中,可以是p|o|s 但不包括m
console.log(str.match(reg))//[ 'app', 'aop', 'asp' ]

范围

在正则表达式的字符类([])中,用连字符(-)连接两个字符可表示一个范围,用于匹配字符串中任意一个属于该范围内的字符(包含范围的起始字符和结束字符本身)。这种写法是对连续字符集合的简化表示,例如[a-z]即代表匹配从a到z之间(包含a和z)[abcde......z]的所有字符。

其范围是根据字符的 ASCII 码值进行排序。当在 [] 中使用 起始字符-结束字符 的形式(如 x-y)时,正则引擎会检查两个字符的 ASCII 码值: ------查看ASCII码表url:www.runoob.com/w3cnote/asc...

  • 只有当 起始字符的 ASCII 码值 ≤ 结束字符的 ASCII 码值 时,这个范围才是有效的,代表 "匹配从起始字符到结束字符之间(包含两者)的所有字符";
  • 如果起始字符的 ASCII 码值大于结束字符(如 z-a),这个范围会被视为无效(通常仅匹配 - 本身,或被忽略,具体取决于正则引擎)。
js 复制代码
let str='0123456789'
let reg=/[9-1]/g
console.log(str.match(reg))
//SyntaxError: Invalid regular expression: /[9-1]/g: Range out of order in character class

范围还能组合使用,例如[1-36-9](实际包含1-3和6-9两个独立范围)、[a-zA-Z](包含a-z和A-Z两个独立范围),只要每个范围自身遵循 ASCII 码(或对应字符集)的顺序即可。 这种组合本质是在同一个字符类中并列多个有效范围,最终匹配的是 "属于任意一个范围的字符",前提是每个范围都满足 "起始字符编码 ≤ 结束字符编码" 的规则。

js 复制代码
let str='123456789'
let reg=/[1-26-8]/g
console.log(str.match(reg))//[ '1', '2', '6', '7', '8' ]

常用范围

数字范围:[0-9] 用字符集[]也可以表示[0123456789],用范围显然更加便捷

js 复制代码
let str='1234567890aB!'
let reg=/[0-9]/g
console.log(str.match(reg))//['1', '2', '3', '4','5', '6', '7', '8','9', '0']

reg=/[0123456789]/g
console.log(str.match(reg))//相同结果

字母范围:[a-z] [A-Z] [a-zA-Z]

js 复制代码
let str='1234abcdABCD!'
let reg=/[a-z]/g
console.log(str.match(reg))//[ 'a', 'b', 'c', 'd' ]

reg=/[A-Z]/g
console.log(str.match(reg))//[ 'A', 'B', 'C', 'D' ]


reg=/[a-zA-Z]/g
console.log(str.match(reg))//['a', 'b', 'c','d', 'A', 'B','C', 'D']

其他

特殊符号范围[!-/]

js 复制代码
let str='!\"#$%&\'()*+,-./'//对引号进行转义
let reg=/[\!-\\]/g//特殊符号转义表示原义
console.log(str.match(reg))['!', '"', '#', '$','%', '&', "'", '(',')', '*', '+', ',','-', '.', '/']

预定义字符类

预定义字符类(也称为 "元字符" 或 "特殊序列")是一组预先定义的特殊符号,用于简洁表示常见的字符集合,避免手动编写冗长的字符类(如[0-9] [a-zA-Z0-9_]等)。它们本质是对 "特定类型字符集合" 的标准化缩写,简化了正则表达式的书写。

数字字符类 \d 数字字符匹配0-9之间的数字。是[0-9]的简写形式。

js 复制代码
let str='1234567890'
let reg=/\d/g
console.log(str.match(reg))//['1', '2', '3', '4','5', '6', '7', '8','9', '0']

str='2024-05-20 14:30:00|今天天气晴朗,适合出游'
reg=/\d\d:\d\d:\d\d/g
console.log(str.match(reg))//[ '14:30:00' ]

单词字符类 \w 单词字符匹配字母、数字和下划线。是[a-zA-Z0-9_]的简写形式。

js 复制代码
let str='Hi! 3_3'
let reg=/\w/g
console.log(str.match(reg))//['H', 'i', '3','_','3']

空白字符类 \s 空白字符匹配空格、制表符(、换行符)。

js 复制代码
let str='Hello world!\t\r\n'
let reg=/\s/g
console.log(str.match(reg))//[ ' ', '\t', '\r', '\n' ]

点字符类 (.) 点字符(.) 是一个基础的预定义字符类,其核心定义为:匹配除换行符(\n)之外的任意单个字符,是对 "任意单个字符(换行除外)" 这一常见需求的简洁表达。但当有s模式标志是也能匹配\n。

js 复制代码
let str='Hello world!'
console.log(str.match(/./g))//['H', 'e', 'l', 'l','o', ' ', 'w', 'o','r', 'l', 'd', '!']
str='Hello world!\n'
console.log(str.match(/!./s))//[ '!\n', index: 11, input: 'Hello world!\n', groups: undefined ]
预定义字符类 匹配内容(等价的字符类)
. 除换行符(\n)外的任意单个字符(无等价类)
\d 任意数字字符(等价于 [0-9])
\w 字母、数字、下划线(等价于 [a-zA-Z0-9_])
\s 空白字符(空格、制表符 \t、换行符 \n 等,等价于 [ \t\n\r\f\v])

反向字符类

反向字符类(也叫 "否定字符类")是正则表达式中对普通字符类的 "否定形式",核心功能是匹配 "不在指定字符集合(或范围)内的单个字符",语法上通过在方括号[]内的第一个位置添加脱字符^ 来标识。

反向集合

将字符集合用 ^ 符号(脱字符)放在方括号内,表示匹配字符串中一个字符不在该集合中。如[^abc],则匹配除了a、b、c之外的字符。

js 复制代码
let str='app aop asp amp'
let reg=/a[^pos]p/g//匹配a某p形式的字符串 中间字符不存在在集合[pos]中,可以是其他字符 但不包括p|o|s
console.log(str.match(reg))//[ 'amp' ]

反向范围

^脱字符也可以用于否定范围

js 复制代码
let str='123456789'
let reg=/[^a-z]/g
console.log(str.match(reg))//['1', '2', '3','4', '5', '6','7', '8', '9']

反向预定义字符类

反向数字字符类 \D 非数字字符(等价于 [^0-9],如字母、符号、空格等)

js 复制代码
let str='1234567890 Aa!'
let reg=/\D/g
console.log(str.match(reg))//[' ', 'A', 'a','!' ]

反向单词字符类 \W 非单词字符(等价于 [^a-zA-Z0-9_],如 !、@、空格等)

js 复制代码
let str='123 Aa!'
let reg=/\W/g
console.log(str.match(reg))//[ ' ', '!' ]

反向空白字符类 \S 非空白字符(等价于 [^ \t\n\r\f\v],如字母、数字、符号等)

js 复制代码
let str='123 Aa!'
let reg=/\S/g
console.log(str.match(reg))//[ '1', '2', '3', 'A', 'a', '!' ]
反向预定义字符类 对应原预定义字符类 匹配内容(等价反向字符类)
\D \d 非数字字符(等价于 [^0-9],如字母、符号、空格等)
\W \w 非单词字符(等价于 [^a-zA-Z0-9_],如 !、@、空格等)
\S \s 非空白字符(等价于 [^ \t\n\r\f\v],如字母、数字、符号等)

总结

范围是对常用集合的简写,预定义是对常用范围的简写。可以优先考虑预定义字符类,再考虑范围,最后考虑集合。

上次题目答案

js 复制代码
//题目1
let str='Hello World! This is a Test. I love JavaScript.'
let reg=/test/i
console.log(reg.test(str))

//题目2
let str='2024-05-20 14:30:00|今天天气晴朗,适合出游'
let arr=str.split(/-| |:|\|/g) //| 表示或 \| 表示转义表示|这个字符没有特殊意义
console.log(arr)

//题目3
let str='I like Apple, and I ate an apple yesterday. My favorite is APPLE!'
let result=str.replace(/apple/gi,'orange')
console.log(result)

题目

题目1

电商平台用户注册时需验证手机号格式:中国大陆手机号为 11 位数字,且首位固定为 1,第二位为 3-9(如 138xxxx1234、199xxxx5678)。请编写正则表达式,使用test方法判断输入字符串是否符合该格式(忽略其他字符,仅验证纯手机号)。 提示:^匹配开头,匹配结尾,{}表示个数。\^1匹配1开头 1匹配1结尾,{3}表示重复3次。

题目2

电商订单系统中,订单号格式为 "ORD-20240601-5678"(前缀 ORD-、日期、后缀数字,中间用-分隔)。请编写代码,从任意订单号字符串中提取所有数字部分,并拼接成一个完整数字字符串(如输入 "ORD-20240601-5678",输出 "202406015678")。

题目3

用户设置密码时,需满足 "至少包含 1 个大写字母、1 个小写字母、1 个数字、1 个特殊符号(非字母 / 数字 / 下划线)" 的基础要求。请编写代码,判断输入的密码字符串是否满足该条件(忽略密码长度,仅校验字符类型)。

相关推荐
郝开3 小时前
5. React中的组件:组件是什么;React定义组件
前端·javascript·react.js
FuckPatience3 小时前
电脑所有可用的网络接口
前端·javascript·vue.js
前端开发爱好者4 小时前
尤雨溪宣布:Vite 纪录片震撼发布!
前端·javascript·vue.js
北城以北88884 小时前
ES6(二)
前端·javascript·es6
渣哥4 小时前
多环境配置利器:@Profile 在 Spring 项目中的实战价值
javascript·后端·面试
U.2 SSD4 小时前
Echart仪表盘示例
javascript·echarts
qq_1841776774 小时前
前端自动部署项目到服务器
服务器·前端·javascript
Never_Satisfied4 小时前
在JavaScript / HTML / Node.js中,post方式的Content-Type属性的text的三种编码
javascript·node.js·html
Never_Satisfied5 小时前
在JavaScript / HTML中,Chrome报错Refused to execute inline script
javascript·chrome·html