JavaScript正则表达式——3.量词详解

JavaScript正则量词详解

摘要
本文介绍了正则表达式中的三种量词类型及其应用:具体量词{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),具体规则为:

  1. URL 可包含任意合法前缀(如http://example.com/list或https://shop.cn/goods);
  2. categoryId参数仅存在于 URL 的查询字符串中(即?之后),参数值仅由数字组成(至少 1 位);
  3. 该参数可位于查询字符串的开头、中间或结尾(如?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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值