摘要
本文介绍了正则表达式中的三种量词类型及其应用:具体量词{n}用于精确匹配n次重复字符;范围量词{n,m}用于匹配n到m次重复;简写量词*(0次或多次)、+(1次或多次)、?(0次或1次)。文章通过代码示例演示了各类量词的实际应用场景,如匹配身份证号、日期、版本号等,并提供了量词总结表格。最后给出了三道编程题目的参考答案,涉及URL参数提取、路径验证和链接校验等实际应用场景。
1.具体量词
形如{n}表示具体指定字符个数,写在要表示重复n次字符的后面,要求n个字符是连续的,省去了重复写入和减少错误,如匹配"2025-01-01"用’/\d{4}-\d{2}-\d{2}/‘来代替’/\d\d\d\d-\d\d-\d\d/'。
// 匹配身份证号的前6位地址码
let str = '110101199001011234'; // 实际身份证号格式
let reg = /\d{6}/; // 匹配前6位数字
console.log("示例1 - 身份证前6位地址码:");
console.log(str.match(reg)); // [ '110101', index: 0, ... ]
// 匹配手机号的前3位运营商代码
let str = '13812345678'; // 实际手机号格式
let reg = /1\d{2}/; // 匹配以1开头的3位数字
console.log(str.match(reg)); // [ '138', index: 0, ... ]
// 匹配日期中的4位年份
let str = '2023年10月05日'; // 实际日期格式
let reg = /\d{4}/; // 匹配4位数字表示的年份
console.log("\n示例3 - 日期中的4位年份:");
console.log(str.match(reg)); // [ '2023', index: 0, ... ]
2.范围量词
形如{n,m}表示n-m个字符,写在要表示重复n-m次字符的后面。m可省略,表示n个以上字符。
// 1. 匹配1-3个字母a
let str = 'a aa aaa aaaa';
let reg = /a{1,3}/g;
console.log("1-3个a:", str.match(reg)); // ['a', 'aa', 'aaa', 'aaa']
// 3. 匹配3-5个任意字符
let str = 'ab cde fghij klmno';
let reg = /.{3,5}/g;
console.log("3-5个任意字符:", str.match(reg)); // ['cde', 'fghij', 'klmno']
3.简写量词
*:相当于{0,}匹配零次或多次
+:相当于{1,}匹配1次或多次
?:相当于{0,1}匹配零次或一次
let str = 'The latest versions are v1.0, v2.5.3 and v3';
//*
let reg = /\.\d*/g; // 匹配小数点后跟0个或多个数字
console.log("* 匹配结果:", str.match(reg));// ['.0', '.5', '.3', '']
//+
let reg = /\d+/g; // 匹配1个或多个连续数字
console.log("+ 匹配结果:", str.match(reg));//['1', '0', '2', '5', '3', '3']
//?
let str = 'Is this color or colour?';
let reg = /colou?r/g;
console.log(str.match(reg));
注意
与0有关的量词,不要单独使用容易出现错误,通常是与其他字符组合使用。
let str='a'
console.log(str.match(/a?/g))//[ 'a', '', '' ] //多匹配出一个空字符串
console.log(str.match(/a*/g))//[ 'a', '', '' ]
console.log(str.replace(/a?/g,'b'))//bbbb
let str='ab'
console.log(str.match(/ab?/g))//[ 'ab' ] //多匹配出一个空字符串
console.log(str.match(/ab*/g))//[ 'ab' ]
console.log(str.replace(/ab?/g,'b'))//b
4.总结
| 量词 | 描述 |
|---|---|
| * | 匹配零次或多次。 |
| + | 匹配一次或多次。 |
| ? | 匹配零次或一次。 |
| { n } | 正好匹配 n 次。 |
| { n ,} | 至少匹配 n 次。 |
| { n , m } | 从 n 到 m 次之间匹配。 |
5.上次题目答案
题目1:
/*题目1
电商平台用户注册时需验证手机号格式:中国大陆手机号为 11 位数字,且首位固定为 1,第二位为 3-9
(如 138xxxx1234、199xxxx5678)。请编写正则表达式,使用test方法判断输入字符串是否符合该格式
(忽略其他字符,仅验证纯手机号)。
提示:\^匹配开头,\$匹配结尾,{}表示个数。\^1匹配1开头 1\$匹配1结尾,{3}表示重复3次。
*/
let test1="13812345678"//第二位在3-9之间,11位
let test2="12812345678"//第二位不在3-9之间,11位
let test3="1381234567"//第二位在3-9之间,10位
let reg=/1[3-9]\d{9}/ //匹配1开头,第二位在3-9之间,\d{9}表示有9个数字可以用9个\d代替,总长11位。
console.log(reg.test(test1))//true
console.log(reg.test(test2))//false
console.log(reg.test(test3))//false
/*题目2
电商订单系统中,订单号格式为 “ORD-20240601-5678”(前缀 ORD-、日期、后缀数字,中间用-分隔)。
请编写代码,从任意订单号字符串中提取所有数字部分,并拼接成一个完整数字字符串(如输入 “ORD-20240601-5678”,
输出 “202406015678”)。
*/
let test1="ORD-20240601-5678"
let test2="ORD-20240602-9012"
let reg= /\d/g
console.log(test1.match(reg).join(''))//202406015678
console.log(test2.match(reg).join(''))//202406029012
/*题目3
用户设置密码时,需满足 “至少包含 1 个大写字母、1 个小写字母、1 个数字、1 个特殊符号(非字母 / 数字 /
下划线)” 的基础要求。请编写代码,判断输入的密码字符串是否满足该条件(忽略密码长度,仅校验字符类型)。
*/
let test1="Pwd123!"
let test2="pwd123!"//缺少大写字母
let test3="Pwd123_"//缺少非下划线的特殊字符
function checkPwd(pwd) {
if(!/[A-Z]/.test(pwd))return false
if(!/[a-z]/.test(pwd))return false
if(!/\d/.test(pwd))return false
if(!/\W/.test(pwd))return false
return true
}
console.log(checkPwd(test1))//true
console.log(checkPwd(test2))//false
console.log(checkPwd(test3))//false
6.题目
题目 1
某电商项目需编写代码,从商品列表页的 URL 中提取 “分类 ID” 参数(参数名固定为categoryId),具体规则为:
- URL 可包含任意合法前缀(如http://example.com/list或https://shop.cn/goods);
- categoryId参数仅存在于 URL 的查询字符串中(即?之后),参数值仅由数字组成(至少 1 位);
- 该参数可位于查询字符串的开头、中间或结尾(如?categoryId=123、?page=2&categoryId=45、?sort=price&categoryId=6),若 URL 中无该参数则返回null。
符合提取要求的 URL 例子:
http://example.com/list?categoryId=123(提取分类 ID 为123)、https://shop.cn/goods?page=2&categoryId=45&sort=price(提取分类 ID 为45)、https://m.shop.com?sort=new&categoryId=6(提取分类 ID 为6)
不符合 / 无参数的 URL 例子:
http://example.com/list?cid=123(参数名错误,应为categoryId)、https://shop.cn/goods?categoryId=abc(参数值含非数字)、https://m.shop.com?sort=new(无categoryId参数,返回null)
要求匹配出“categoryid=xx"的形式。
题目 2
某后台管理系统需编写代码,校验管理端 URL 的路径层级是否合法,具体规则为:1. URL 协议仅允许https(需包含https://);2. 域名固定为admin.company.com(不允许其他域名);3. 路径需严格遵循 “/admin/[模块名]/[操作名]” 结构,其中模块名仅由小写字母和_组成(至少 2 位,如user、goods_manage),操作名仅由小写字母组成(至少 1 位,如list、edit),不允许额外层级(如/admin/user/list/detail为非法)。
符合要求的 URL 例子:
https://admin.company.com/admin/user/list(模块名user,操作名list)、https://admin.company.com/admin/goods_manage/edit(模块名goods_manage,操作名edit)、https://admin.company.com/admin/order/pay(模块名order,操作名pay)
不符合要求的 URL 例子:
http://admin.company.com/admin/user/list(协议非法,需为https)、https://admin.other.com/admin/user/list(域名错误,应为admin.company.com)、https://admin.company.com/admin/user_list(路径层级缺失,缺少 “操作名”)、https://admin.company.com/admin/user/list/detail(路径多额外层级/detail)
JavaScript正则量词详解
292

被折叠的 条评论
为什么被折叠?



