文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Javascript 正则深入以及十个非常有意思的正则实战

2024-12-02 18:24

关注

对于前端工程师来说, 正则表达式也许是javascript语言中最晦涩难懂的, 但是也往往是最简洁的.工作中遇到的很多问题,诸如搜索,查找, 高亮关键字等都可以使用正则轻松解决,所以有句话说的好:

正则用的好, 加班远离我.

今天笔者就复盘一下javascript正则表达式的一些使用技巧和高级API, 并通过几个实际的案例,来展现正则表达式的魅力.如果大家觉得正则表达式理解起来很麻烦,也可以使用如下在线网站, 只需要输入你的正则表达式, 它就能以图形的方式将你的正则展示出来:

你将收获

正文

对于正则的基本用法笔者这里就不总结了,这里重点介绍一些比较有用且难懂的知识点.在最后笔者会写10个经典的正则案例, 供大家学习参考, 或者在工作中直接使用.

以上几点应用笔者在下文中会写几个例子来讲解.

模式匹配的用法(x)

模式匹配主要用来匹配某一类字符串并记住匹配项.

案例:

  1. let str = 'xuxi is xuxi is' 
  2. let reg = /(xuxi) (is) \1 \2/g 
  3. reg.test(str)  // true    (1) 
  4. str.replace(reg, '$1 $2')  // xuxi is  (2) 

解释: 其中括号被称为捕获括号, 模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 xuxi 和 is,匹配了原字符串中的后两个单词, 因此(1)中运行的结果为true. 当我们在字符串中使用replace时, 我们可以使用$1, $2这样的方式获取第n个匹配项,并用来替换字符串. 如(2)中的运行结果.

非捕获括号的模式匹配(?:x)

主要用来匹配某一类字符串但不记住匹配项.

案例:

  1. let str = 'xuxixuxi' 
  2. let reg = /(?:xuxi){1,2}/g 
  3. reg.test(str)  // true    (1) 

解释: 其中(?:)被称为非捕获括号, 我们可以使用它匹配一组字符但是并不记住该字符,一般用来判断某类字符是否存在于某字符串中.

先行断言x(?=y)

先行断言: 匹配'x'仅仅当'x'后面跟着'y'.

案例:

  1. let str = '王者融化' 
  2. let reg = /王(?=者)/ 
  3. reg.test(str)  // true    (1) 

解释: /王(?=者)/会匹配到"王"仅当它后面跟着"者".但是"者"不属于匹配结果的一部分.

后行断言(?<=y)x

后行断言: 匹配'x'仅当'x'前面是'y'.

案例:

  1. let str = 'xuxiA' 
  2. let reg = /(?<=xuxi)A/ 
  3. reg.test(str)  // true    (1) 

解释: /(?<=xuxi)A/会匹配到A仅当它前面为xuxi.但是xuxi不属于匹配结果的一部分.

正向否定查找x(?!y)

正向否定查找: 仅仅当'x'后面不跟着'y'时匹配'x'.

案例:

  1. let str = '3.1415' 
  2. let reg = /\d+(?!\.)/ 
  3. reg.exec(str)  // [1415]   (1) 

解释: 其中/\d+(?!.)/匹配一个或多个数字,当且仅当它后面没有小数点时, 所以(1)中执行后会匹配到1415而不是3.1415

反向否定查找(?

反向否定查找: 仅仅当'x'前面不是'y'时匹配'x'.

案例:

  1. let str = '3.1415' 
  2. let reg = /(?
  3. reg.exec(str)  // [3]    (1) 

解释: /(?

字符集合和反向字符集合的用法 [xyz] / [^xyz]

[xyz]: 一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。

[^xyz]: 一个反向字符集。也就是说,它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的

案例:

  1. let str = 'abcd' 
  2. let reg1 = /[a-c]+/ 
  3. let reg2 = /[^d]$/ 
  4. reg1.test(str)  // true    (1) 
  5. reg2.test(str)  // false    (2) 

解释: (1)中将返回true因为字符串中包含a-c中的字符, (2)中奖返回false, 因为字符串结尾为d, 但正则reg2需要匹配结尾不为d的字符串.

词边界和非单词边界匹配\b\B

\b 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。

\B 匹配一个非单词边界。匹配如下几种情况:(1)字符串第一个字符为非“字”字符 (2)字符串最后一个字符为非“字”字符 (3)两个单词字符之间 (4)两个非单词字符之间 (5)空字符串

案例:

  1. let str = 'xuxi' 
  2. let reg1 = /xi\b/ 
  3. let reg2 = /xu\B/ 
  4. reg1.exec(str)  // [xi]    (1) 
  5. reg2.exec(str)  // [xu]    (2) 

解释: (1)中匹配到了单词边界,即xi, 为该字符串的末尾.(2)中应为xu为非单词边界,所以会被其匹配到.

空白字符/非空白字符匹配\s\S

  1. \s: 匹配一个空白字符,包括空格、制表符、换页符和换行符. 
  2.  
  3. \S: 匹配一个非空白字符 

案例:

  1. let str = 'xuxi is' 
  2. let reg1 = /.*\s/g 
  3. let reg2 = /\S\w*/g 
  4. reg1.exec(str)  // [xuxi]    (1) 
  5. 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) { 
  2.   let reg = new RegExp(`<${tagName}(\\s.*)*>(\\n|.)*<\\/${tagName}>`, "g"
  3.   return htmlStr.replace(reg, ''

短横线命名转驼峰命名

  1. // 短横线转驼峰命名, flag = 0为小驼峰, 1为大驼峰 
  2. function toCamelCase(str, flag = 0) { 
  3.   if(flag) { 
  4.     return str[0].toUpperCase() + str.slice(1).replace(/-(\w)/g, ($0, $1) => $1.toUpperCase()) 
  5.   }else { 
  6.     return str.replace(/-(\w)/g, ($0, $1) => $1.toUpperCase()) 
  7.   } 

实现一个简单的模板引擎

关于实现一个模板引擎, 实现中用到了大量的正则,建议感兴趣的可以直接看实现一个简单的模板引擎.

去除字符串中的空格符

  1. function trimAll(str) { 
  2.   return str.replace(/\s*/g,""

判断指定格式的数据输入合法性

  1. function numCheck(str, specialNum) { 
  2.   if(str.indexOf(',') > -1) { 
  3.       return str.splite(',').every(item=>this.numCheck(item)); 
  4.   } else { 
  5.       return str.split(specialNum).length === 2; 
  6.   } 

去除url参数字符串中值为空的字段

  1. // 去除url参数字符串中值为空的字段 
  2. const trimParmas = (parmaStr:string = '') => { 
  3.   return parmaStr.replace(/((\w*?)=&|(&\w*?=)$)/g, ''

将浏览器参数字符串转化为参数对象

  1. function unParams(params = '?a=1&b=2&c=3') { 
  2.   let obj = {} 
  3.   params && params.replace(/((\w*)=([\.a-z0-9A-Z]*)?)?/g, (m,a,b,c) => { 
  4.     if(b || c) obj[b] = c 
  5.   }) 
  6.   return obj 

计算字符串字节数

  1.  
  2. function computeStringByte(str) { 
  3.   let size = 0, 
  4.   strArr = str.split(''), 
  5.   reg = /[\u4e00-\u9fa5]/   // 判断是否为中文 
  6.   for(let i = strArr.length; i--; i>=0) { 
  7.     if(reg.test(strArr[i])) { 
  8.       size+= 2 
  9.     }else { 
  10.       size += 1 
  11.     } 
  12.   } 
  13.   return size 

匹配是否包含中文字符

  1. function hasCn(str) { 
  2.   let reg = /[\u4e00-\u9fa5]/g 
  3.   return reg.test(str) 

实现搜索联想功能

  1. function searchLink(keyword) { 
  2.   // 模拟后端返回数据 
  3.   let list = ['abc''ab''a''bcd''edf''abd']; 
  4.   let reg = new RegExp(keyword, 'i'); 
  5.   return list.filter(item => reg.test(item)) 

 

来源: 趣谈前端内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯