前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式语法-正则表达式教程——语法篇

正则表达式语法-正则表达式教程——语法篇

作者头像
囍楽云
发布2022-12-26 15:31:21
5710
发布2022-12-26 15:31:21
举报
文章被收录于专栏:囍楽云博客

正则表达式,名字听上去就没有吸引力,我发现很多前端对正则表达式都很难做到如数家珍,每次能够运行全凭运气正则表达式语法,更有甚者完全靠复制粘贴,其实这样并不好

  正则表达式其实并不难,语法就那么多,而且一旦掌握在某些时候能够给解决问题提供捷径,更重要的是面试可能会被问到,要是不会那就尴尬了

  本文主要介绍正则表达式的语法部分,下面将正则表达式简称为正则

  正则是啥?

  同学你可以出门右转了,下面是我自己的理解

  正则就是用有限的符号,表达无限的序列,殆已!

  正则表达式的语法一般如下(js),两条斜线中间是正则主体,这部分可以有很多字符组成;i部分是修饰符,i的意思表示忽略大小写

  /^abc/i

  正则定义了很多特殊意义的字符,有名词,量词,谓词等,下面逐一介绍

  简单字符

  没有特殊意义的字符都是简单字符,简单字符就代表自身,绝大部分字符都是简单字符,举个例子

   /abc/ // 匹配 abc

代码语言:javascript
复制
    /123/ // 匹配 123
    /-_-/ // 匹配 -_-
    /海镜/ // 匹配 海镜

  转义字符

  \是转移字符,其后面的字符会代表不同的意思,转移字符主要有三个作用:

  第一种,是为了匹配不方便显示的特殊字符,比如换行,tab符号等

  第二种,正则中预先定义了一些代表特殊意义的字符,比如\w等

  第三种,在正则中某些字符有特殊含义(比如下面说到的),转义字符可以让其显示自身的含义

  下面是常用转义字符列表:

  字符集和

  有时我们需要匹配一类字符,字符集可以实现这个功能,字符集的语法用[]分隔,下面的代码能够匹配a或b或c

   [abc]

  如果要表示字符很多,可以使用-表示一个范围内的字符,下面两个功能相同

   [0123456789]

代码语言:javascript
复制
    [0-9]

  在前面添加^,可表示非的意思,下面的代码能够匹配abc之外的任意字符

1

  其实正则还内置了一些字符集,在上面的转义字符有提到,下面给出内置字符集对应的自定义字符集

  量词

  如果我们有三个苹果,我们可以说自己有个3个苹果,也可以说有一个苹果,一个苹果,一个苹果,每种语言都有量词的概念

  如果需要匹配多次某个字符,正则也提供了量词的功能,正则中的量词有多个,如?、+、*、{n}、{m,n}、{m,}

  {n}匹配n次,比如a{2},匹配aa

  {m, n}匹配m-n次,优先匹配n次,比如a{1,3},可以匹配aaa、aa、a

  {m,}匹配m-∞次,优先匹配∞次,比如a{1,},可以匹配aaaa...

  ?匹配0次或1次,优先匹配1次,相当于{0,1}

  +匹配1-n次,优先匹配n次,相当于{1,}

  *匹配0-n次,优先匹配n次,相当于{0,}

  正则默认和人心一样是贪婪的,也就是常说的贪婪模式,凡是表示范围的量词,都优先匹配上限而不是下限

   a{1, 3} // 匹配字符串'aaa'的话,会匹配aaa而不是a

  有时候这不是我们想要的结果,可以在量词后面加上?,就可以开启非贪婪模式

   a{1, 3}? // 匹配字符串'aaa'的话,会匹配a而不是aaa

  字符边界

  有时我们会有边界的匹配要求,比如已xxx开头,已xxx结尾

  ^在[]外表示匹配开头的意思

   ^abc // 可以匹配abc,但是不能匹配aabc

  $表示匹配结尾的意思

   abc$ // 可以匹配abc,但是不能匹配abcc

  上面提到的\b表示单词的边界

   abc\b // 可以匹配 abc ,但是不能匹配 abcc

  选择表达式

  有时我们想匹配x或者y,如果x和y是单个字符,可以使用字符集,[abc]可以匹配a或b或c,如果x和y是多个字符正则表达式语法,字符集就无能为力了,此时就要用到分组

  正则中用|来表示分组,a|b表示匹配a或者b的意思

   123|456|789 // 匹配 123 或 456 或 789

  分组与引用

  分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)

   (abc){2} // 匹配abcabc

  分组不能放在[]中,分组中还可以使用选择表达式

   (123|456){2} // 匹配 123123、456456、123456、456123

  和分组相关的概念还有一个捕获分组和非捕获分组,分组默认都是捕获的,在分组的(后面添加?:可以让分组变为非捕获分组,非捕获分组可以提高性能和简化逻辑

   '123'.match(/(?123)/) // 返回 ['123']

代码语言:javascript
复制
    '123'.match(/(123)/)  // 返回 ['123', '123']

  和分组相关的另一个概念是引用,比如在匹配html标签时,通常希望后面的xxx能够和前面保持一致

  引用的语法是\数字,数字代表引用前面第几个捕获分组,注意非捕获分组不能被引用

   // 可以匹配

  预搜索

  如果你想匹配xxx前不能是yyy,或者xxx后不能是yyy,那就要用到预搜索

  js只支持先行预搜索,也就是xxx前面必须是yyy,或者xxx前面不能是yyy

   (?=1)2 // 可以匹配12,不能匹配22

代码语言:javascript
复制
    (?!1)2 // 可有匹配22,不能匹配12

  修饰符

  默认正则是区分大小写,这可能并不是我们想要的,正则提供了修饰符的功能,修复的语法如下

   /xxx/gi // 最后面的g和i就是两个修饰符

  g正则遇到第一个匹配的字符就会结束,加上全局修复符,可以让其匹配到结束

  i正则默认是区分大小写的,i可以忽略大小写

  m正则默认遇到换行符就结束了,不能匹配多行文本,m可以让其匹配多行文本

  总结

  刻意练习,方能游刃有余,知己知彼,方能百战百胜,正则是前端的一个武器,技多不压身

  有时我们会遇到特别负责的正则,有时候可能不太只管,下面推荐一个图形化展示的工具,我们把涉及到的语法罗列一下

   /^[a-z]*2{1,10}?(aaa|bbb)(?:ccc)$/

  可以看到工具能够更快的帮我们理清头绪

  本文仅讲述了语法,下一篇文章将详细介绍如何在js中使用正则,推荐一下glob,号称给人看的正则,比正则的语法简单多了,也是平时开发的神器

  1. abc
  2. \d

本文共 1643 个字数,平均阅读时长 ≈ 5分钟

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档