摘要 本文介绍正则表达式中字符类及其应用,包括基础集合、范围表示、预定义字符类(如 \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 个特殊符号(非字母 / 数字 / 下划线)" 的基础要求。请编写代码,判断输入的密码字符串是否满足该条件(忽略密码长度,仅校验字符类型)。