对于前端工程师来说, 正则表达式也许是javascript语言中最晦涩难懂的, 但是也往往是最简洁的.工作中遇到的很多问题,诸如搜索,查找, 高亮关键字等都可以使用正则轻松解决。
(相关资料图)
熟悉我的朋友可能会知道,我一向是不写热点的。为什么不写呢?是因为我不关注热点吗?其实也不是。有些事件我还是很关注的,也确实有不少想法和观点。但我一直奉行一个原则,就是:要做有生命力的内容。
对于前端工程师来说, 正则表达式也许是javascript语言中最晦涩难懂的, 但是也往往是最简洁的.工作中遇到的很多问题,诸如搜索,查找, 高亮关键字等都可以使用正则轻松解决,所以有句话说的好:
正则用的好, 加班远离我.
今天笔者就复盘一下javascript正则表达式的一些使用技巧和高级API, 并通过几个实际的案例,来展现正则表达式的魅力.如果大家觉得正则表达式理解起来很麻烦,也可以使用如下在线网站, 只需要输入你的正则表达式, 它就能以图形的方式将你的正则展示出来:
对于正则的基本用法笔者这里就不总结了,这里重点介绍一些比较有用且难懂的知识点.在最后笔者会写10个经典的正则案例, 供大家学习参考, 或者在工作中直接使用.
以上几点应用笔者在下文中会写几个例子来讲解.
模式匹配主要用来匹配某一类字符串并记住匹配项.
案例:
let str = "xuxi is xuxi is"let reg = /(xuxi) (is) \1 \2/greg.test(str) // true (1)str.replace(reg, "$1 $2") // xuxi is (2)复制代码
解释: 其中括号被称为捕获括号, 模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 xuxi 和 is,匹配了原字符串中的后两个单词, 因此(1)中运行的结果为true. 当我们在字符串中使用replace时, 我们可以使用$1, $2这样的方式获取第n个匹配项,并用来替换字符串. 如(2)中的运行结果.
主要用来匹配某一类字符串但不记住匹配项.
案例:
let str = "xuxixuxi"let reg = /(?:xuxi){1,2}/greg.test(str) // true (1)复制代码
解释: 其中(?:)被称为非捕获括号, 我们可以使用它匹配一组字符但是并不记住该字符,一般用来判断某类字符是否存在于某字符串中.
先行断言: 匹配’x’仅仅当’x’后面跟着’y’.
案例:
let str = "王者融化"let reg = /王(?=者)/reg.test(str) // true (1)复制代码
解释: /王(?=者)/会匹配到”王”仅当它后面跟着”者”.但是”者”不属于匹配结果的一部分.
后行断言: 匹配’x’仅当’x’前面是’y’.
案例:
let str = "xuxiA"let reg = /(?<=xuxi)A/reg.test(str) // true (1)复制代码
解释: /(?<=xuxi)A/会匹配到A仅当它前面为xuxi.但是xuxi不属于匹配结果的一部分.
正向否定查找: 仅仅当’x’后面不跟着’y’时匹配’x’.
案例:
let str = "3.1415"let reg = /\d+(?!\.)/reg.exec(str) // [1415] (1)复制代码
解释: 其中/\d+(?!.)/匹配一个或多个数字,当且仅当它后面没有小数点时, 所以(1)中执行后会匹配到1415而不是3.1415
反向否定查找: 仅仅当’x’前面不是’y’时匹配’x’.
案例:
let str = "3.1415"let reg = /(?
解释: /(?
字符集合和反向字符集合的用法 [xyz] / [^xyz]
[xyz]: 一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。
[^xyz]: 一个反向字符集。也就是说,它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的
案例:
let str = "abcd"let reg1 = /[a-c]+/let reg2 = /[^d]$/reg1.test(str) // true (1)reg2.test(str) // false (2)复制代码
解释: (1)中将返回true因为字符串中包含a-c中的字符, (2)中奖返回false, 因为字符串结尾为d, 但正则reg2需要匹配结尾不为d的字符串.
词边界和非单词边界匹配\b\B
\b 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。
\B 匹配一个非单词边界。匹配如下几种情况:(1)字符串第一个字符为非“字”字符 (2)字符串最后一个字符为非“字”字符 (3)两个单词字符之间 (4)两个非单词字符之间 (5)空字符串
案例:
let str = "xuxi"let reg1 = /xi\b/let reg2 = /xu\B/reg1.exec(str) // [xi] (1)reg2.exec(str) // [xu] (2)复制代码
解释: (1)中匹配到了单词边界,即xi, 为该字符串的末尾.(2)中应为xu为非单词边界,所以会被其匹配到.
空白字符/非空白字符匹配\s\S
\s: 匹配一个空白字符,包括空格、制表符、换页符和换行符.
\S: 匹配一个非空白字符
案例:
let str = "xuxi is"let reg1 = /.*\s/glet reg2 = /\S\w*/greg1.exec(str) // [xuxi] (1)reg2.exec(str) // [xuxi] (2)复制代码
解释: (1)和(2)中执行之后都将匹配xuxi, 一个是空白字符之前的匹配, 一个是非空白字符的匹配.
单字字符/非单字字符匹配\w/W
\w: 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。
\W: 匹配一个非单字字符。等价于 [^A-Za-z0-9_]
由于以上2种模式比较简单,这里就不一一介绍了.
正则10大应用案例
接下来笔者将总结几个使用正则的实际应用,供大家学习和参考.
1. 去除字符串内指定元素的标签
function trimTag(tagName, htmlStr) { let reg = new RegExp(`<${tagName}(\\s.*)*>(\\n|.)*<\\/${tagName}>`, "g") return htmlStr.replace(reg, "")}复制代码
2. 短横线命名转驼峰命名
// 短横线转驼峰命名, flag = 0为小驼峰, 1为大驼峰function toCamelCase(str, flag = 0) { if(flag) { return str[0].toUpperCase() + str.slice(1).replace(/-(\w)/g, ($0, $1) => $1.toUpperCase()) }else { return str.replace(/-(\w)/g, ($0, $1) => $1.toUpperCase()) }}复制代码
3. 实现一个简单的模板引擎
关于实现一个模板引擎, 实现中用到了大量的正则,建议感兴趣的可以直接看实现一个简单的模板引擎.
4. 去除字符串中的空格符
function trimAll(str) { return str.replace(/\s*/g,"")}复制代码
5. 判断指定格式的数据输入合法性
function numCheck(str, specialNum) { if(str.indexOf(",") > -1) { return str.splite(",").every(item=>this.numCheck(item)); } else { return str.split(specialNum).length === 2; }}复制代码
6. 去除url参数字符串中值为空的字段
// 去除url参数字符串中值为空的字段const trimParmas = (parmaStr:string = "") => { return parmaStr.replace(/((\w*?)=&|(&\w*?=)$)/g, "")}复制代码
7. 将浏览器参数字符串转化为参数对象
function unParams(params = "?a=1&b=2&c=3") { let obj = {} params && params.replace(/((\w*)=([\.a-z0-9A-Z]*)?)?/g, (m,a,b,c) => { if(b || c) obj[b] = c }) return obj}复制代码
8. 计算字符串字节数
/** * 计算字符串字节数 * @param str * @desc 一个中文占2个字节, 一个英文占一个字节 */function computeStringByte(str) { let size = 0, strArr = str.split(""), reg = /[\u4e00-\u9fa5]/ // 判断是否为中文 for(let i = strArr.length; i--; i>=0) { if(reg.test(strArr[i])) { size+= 2 }else { size += 1 } } return size}复制代码
9. 匹配是否包含中文字符
function hasCn(str) { let reg = /[\u4e00-\u9fa5]/g return reg.test(str)}复制代码
10. 实现搜索联想功能
function searchLink(keyword) { // 模拟后端返回数据 let list = ["abc", "ab", "a", "bcd", "edf", "abd"]; let reg = new RegExp(keyword, "i"); return list.filter(item => reg.test(item))}
- 当前热点-Javascript正则深入以及十个非常有意思的正则实战
- 微软发布 Visual Studio 2022 17.6 更新:改进搜索、优化性能、引入 Sticky Scroll|快消息
- 每日时讯!Node Docker 官方镜像使用方法
- 八个经常困扰大家的常见JavaScript 面试题
- 【热闻】德国公立大学开收学费! 国际生一学期最高需交6000欧元
- 汽车尾气治理方法有哪些?治理尾气最有效的办法是什么?
- 世界快报:高盛:人工智能推动,未来10年标普500成分股公司利润有望增长30%
- 环球要闻:子公司Romaco订单恢复中 楚天科技:今年将完善生物前端产品开发|直击股东会
- 大唐新能源4月发电量同比增20% 股价一度涨超7%
- 【世界播资讯】野村全面下调主要业务税前利润目标 首席执行官Okuda面临挑战
- “朋友圈出租”能赚钱?支付宝辟谣:此类活动均为诈骗,请勿信-天天热点
- 环球讯息:总投资1576.2亿元,武汉二季度232个重大项目开工
- 每日时讯!Node Docker 官方镜像使用方法
- 当前热点-Javascript正则深入以及十个非常有意思的正则实战
- 发达经济体通胀爆表,是源于“贪婪通胀”吗?
- 【天天时快讯】惠理集团(00806.HK)4月末管理资产总值约63亿美元
- 八个经常困扰大家的常见JavaScript 面试题
- 微软发布 Visual Studio 2022 17.6 更新:改进搜索、优化性能、引入 Sticky Scroll|快消息
- 先正达集团将转申报沪市主板,上交所:充分尊重企业对上市板块的自主选择_全球通讯
- 【热闻】德国公立大学开收学费! 国际生一学期最高需交6000欧元
- 支付宝官方辟谣:请勿信!此类活动均为诈骗|当前最新
- 全球今日讯!电声股份:2022年公司经营活动产生的现金流量净额为0.64亿元,情况良好
- [路演]运达科技:已在储能领域有所布局 看好产业发展前景|天天要闻
- 世界讯息:外交部:G7对发展中国家口惠而实不至 并非新鲜事
- 基辛格支持乌克兰加入北约?外交部表态
- BHG Mall解锁年轻密码,2023 BHG DAY乘风破浪树商业新标杆
- 焦点观察:本月将发射神舟十六号载人飞船
- 收盘丨沪指涨0.40%,人工智能板块全天强势
- 快讯:DIY波西米亚沙滩巾_适合男生送男生的生日礼物
- 汽车尾气治理方法有哪些?治理尾气最有效的办法是什么?
- 深度|停产、欠薪或关停门店,二线新势力车企怎么了? 世界头条
- 上市银行息差收窄营收放缓,如何创造价值穿越周期_世界新资讯
- 今亮点!对人竖起中指什么意思_只竖起中指是什么意思
- 【全球报资讯】深圳写字楼空置率下降,港资企业表现活跃
- 周鸿祎:大模型将会带来一场新工业革命 未来两三年中国大模型发展大有机会|世界要闻
- 日本连续21个月出现贸易逆差 焦点快报
- 教育部部长:持续加强人工智能相关学科专业和平台载体建设 培养一大批人工智能高端人才 天天时讯
- 环球快看:商业银行纷纷下架“智能通知存款” 专家:中小银行应发力业务驱动型存款
- 重要货币市场基金监管新规落地!专家:市场安全性将大幅提高
- 环球要闻:子公司Romaco订单恢复中 楚天科技:今年将完善生物前端产品开发|直击股东会
- 刘庆峰:讯飞星火语言理解能力离ChatGPT仅一步之遥 在10月之前就会超越 全球新视野
- 全球首个5G异网漫游试商用,运营商5G布局还有哪些新进展? 当前滚动
- 世界快报:高盛:人工智能推动,未来10年标普500成分股公司利润有望增长30%
- 文物专家为市民免费鉴宝
- 笑果文化风波后,多家脱口秀演出暂停 世界观速讯
- 调查显示:61%美国人担心AI对人类构成潜在威胁-今日热搜
- 【世界播资讯】野村全面下调主要业务税前利润目标 首席执行官Okuda面临挑战
- 湖北出新规:从事网络餐饮服务,必须要有实体经营门店 微头条
- 大唐新能源4月发电量同比增20% 股价一度涨超7%
- 低基数下4月社零同比增长18.4%,消费复苏势头延续|环球最资讯
- 天天微资讯!万达电影(002739.SZ):截至目前自渠会员数接近5000万,自渠票房占比接近30%,今年一季度也在不断提升
- 全球热推荐:“具身AI”将引领下一代人工智能浪潮 英伟达特斯拉都在布局
- 华尔街相中的20只最有潜力AI概念股 这对A股有何启示?|聚焦
- 我国与中亚五国月度进出口规模首破500亿元 世界滚动
- 新动态:索尼金融退市三年后又打算上市 究竟打的什么算盘?
- 针对XBB的重组多价新冠蛋白疫苗获临床批件,威斯克生物:是全球首个
- 通信ETF涨5%,AI浪潮归来? 热推荐
- 环球今头条!H&H国际控股(01112.HK)附属拟将获授人民币5亿元贷款融资
- 港股异动 | 飞天云动大涨超17% 探索产教融合新路径 建立元宇宙教培新高地_天天播报
- 爱护公共设施手抄报简单_爱护公共设施手抄报_焦点热议
- 5月18日国内醋酐企业报价趋稳-世界看点
- 吴承泽入监服刑!系A股最大“盘后票”团伙主犯,刑期19年-环球精选
- 奥园健康(03662.HK)2022年度转亏为盈溢利1.6亿人民币
- 【天天报资讯】全球供应链战略启动,盒马宣布将在全球设立8大采购中心
- 全球热资讯!国泰航空(00293.HK)4月载客按年增3283%
- 连平:透过上市房企财报看行业如何破局_世界快资讯
- 4月份全国财政收入同比大增70%,原因在这
- 金至尊铂金多少钱一克(2023年05月18日)参考价格 全球微头条
- 财政部:1-4月印花税收入1637亿元 同比下降14.2%-环球消息
- 基建股早盘拉升走高 中国中铁涨近5%中国铁建涨近4%-每日快讯
- 【世界快播报】CTRHOLDINGS(01416.HK)涨超16% 料年度扭亏为盈赚不超700万新元
- 安信国际:能源装备增长强劲 氢能业务潜力十足 推荐投资者关注中集安瑞科_天天聚看点
- 国家金融监督管理总局官方微信公众号今日上线
- 【天天速看料】社区中秋活动方案设计 社区中秋活动方案
- 中通快递2023年Q1调整后净利19.2亿元 管理层称将调高全年业绩目标|直击业绩会_环球速看
- 全球即时看!初见成效!奈飞广告套餐月活跃用户达到500万
- 聚焦:财政部:1-4月土地和房地产相关税收中房产税1529亿元 同比增长20.5%
- 财政部:1-4月全国一般公共预算支出86418亿元 同比增长6.8%-天天热点评
- 浦发银行青岛分行成功举办“浦发企明星”暨海上书房活动 天天通讯
- 服务升温 情暖人心 全球快资讯
- 当前视点!国家金融监督管理总局官方微信公众号今日上线
- 财政部:1-4月证券交易印花税716亿元 同比下降42.7%
- 速看:6G板块大幅拉升 多股涨超5%
- 支付宝集五福的好处有哪些?支付宝五福哪个不好集?
- 环球关注:国家医保局:将进一步完善居民医保个人缴费机制 推动更多就业人员在就医地、常住地参保
- 哥伦比亚一金矿遭炸弹袭击 已致2死14伤_热文
- 重大利好来袭!华虹半导体科创板上市获批 港股一度涨超10%_世界球精选
- 热血男人陈奕天 不爱大长腿只爱打斗-环球信息
- 工商银行推出手机银行“亿起悦享”大型优惠活动
- 全球好豆 汇聚昆山 2023中国(昆山)国际咖啡产业大会 暨国际咖啡豆贸易周将于6.18启幕
- 千足银有哪些标志?s9999万足银是纯银吗?
- 全球消息!中通快递Q1利润大增84% 市场份额继续扩张 机构:强烈推荐头部快递股
- 国家金融监督管理总局揭牌 我国新一轮金融监管领域机构改革迈出重要一步
- 让英雄精神绽放时代光芒 天津音乐学院民族歌剧《同心结》亮相第五届中国歌剧节
- “拒绝酒驾”宣传进夜市 环球聚看点
- 中通快递-SW(02057.HK)首季归属股东净利16.7亿人民币 按年增84.3% 观热点
- 全球热推荐:中通快递-SW(02057.HK):陈旭东获任非执行董事
- 天天关注:深化“5G+工业互联网” 融合创新和规模应用
- 德琪医药-B(06996.HK):ATG-031的I期药效试验获美国FDA的IND许可-焦点报道
- 华丽家族涨停 2022年年度股东大会所有议案均未获得通过
- 马斯克称人形机器人市场将超电动车 机器人板块早盘拉升 相关产业链有望受益_焦点观察
- 环球今亮点!特斯拉据称正考虑在印度再建一家制造厂
- 世界电信日,安全为何仍是重要议题-资讯推荐
- 人民币兑美元中间价报6.9967,调贬219个基点
- 【环球报资讯】阳光人寿青岛分公司开展“打击和防范经济犯罪”宣传活动
- 基金调研忙:永赢闯入基金调研榜单前五,诺德罗世锋半个季度现身3场调研
- 第六届中国—欧佩克高级别对话会成功举行
- 困境儿童翔翔和他的“粉丝团” ——2023年“小海豚计划”“大手牵小手”系列报道(三)
- 环球热议:魏野_关于魏野简述
- 即时看!人民币对美元汇率年内首“破7” 后市怎么走?
热门产品排行榜
编辑推荐排行榜
- 1 “朋友圈出租”能赚钱?支付宝辟谣:此类活动均为诈骗,请勿信-天天热点
- 2 环球讯息:总投资1576.2亿元,武汉二季度232个重大项目开工
- 3 每日时讯!Node Docker 官方镜像使用方法
- 4 当前热点-Javascript正则深入以及十个非常有意思的正则实战
- 5 发达经济体通胀爆表,是源于“贪婪通胀”吗?
- 6 【天天时快讯】惠理集团(00806.HK)4月末管理资产总值约63亿美元
- 7 八个经常困扰大家的常见JavaScript 面试题
- 8 微软发布 Visual Studio 2022 17.6 更新:改进搜索、优化性能、引入 Sticky Scroll|快消息
- 9 先正达集团将转申报沪市主板,上交所:充分尊重企业对上市板块的自主选择_全球通讯
- 10 【热闻】德国公立大学开收学费! 国际生一学期最高需交6000欧元
关于我们| 联系方式| 版权声明| 供稿服务| 友情链接
咕噜网 www.cngulu.com 版权所有,未经书面授权禁止使用
Copyright©2008-2023 By All Rights Reserved 皖ICP备2022009963号-10
联系我们: 39 60 29 14 2@qq.com