JavaScript--正则表达式的最基本了解

1,714 阅读5分钟

前言

最近好久没更新文章了,因为最近都在刷一些面试题,然后没时间写笔记了,因为写笔记确实很耗费我的精力,我在学习上有点强迫症,还是希望把涉及到的知识都细化清楚。当然太晦涩且感觉没啥用的我就自动过滤了哈哈哈哈哈。最近也找到工作了。所以也就相对来讲,闲下来了,当然还有几个面试还没有结束。。不过也想看看有没有更好的选择。虽然感觉机会也不是很大,毕竟是社招,估计后面几面的难度会很高。尽力就好。公考的笔试也下来了,虽然笔试第二,但是公考的面试。。。。不适合我,毕竟我是真的不擅长表达。如果想冲一冲,可能得花两万报个班。杀了我吧。所以我还是决定放弃了,我觉得我对技术会更感兴趣。不过也算是一种经历了,人生任何一段经历都是一段财富。
最后由衷的感谢2020,不平凡的一年也让我更快成熟。

正则表达式的定义

在JS中,正则表达式的定义存在两种形式。

  • 正则字面量的形式
    var Reg = /abc/gi
  • 通过RegExp构造函数来创建实例,这种方式存在两种形式
    1. new RegExp(String[,String])
      这种形式的话,一定要注意一个问题,首先String是不包含双斜杠的,其次,就是\是需要转义的:
      var a = new RegExp("a[0-8]\s","i")//错误,这里的\是需要转义的 var a = new RegExp("a[0-8]\\s","gi")//正确
      这里第二个参数String是后面要说的修饰符。
    2. new RegExp(正则字面量[,String])
      这种就没什么好说的,挺呆的这种方式。
      var a = new RegExp(/a[0-8]\s/,"gi")

正则表达式的常见特殊字符

  • 开始符^
  • 结束符$
    通过开始结束符,规定正则表达式只能匹配以什么开头和什么结尾的字符串。
var Reg = /abc/;
Reg.test("abc");//true
Reg.test("aaabccc");//true
var Reg = /^abc$/;
Reg.test("abc");//true
Reg.test("aababccc");//false
  • 字符?
    就是说字符表达式出现的次数是0-1。
  • 字符+
    就是说字符表达式出现的次数是1-正无穷
  • 字符*
    就是说字符表达式出现的次数是0-正无穷
  • 字符\d
    就是说包含所有的数字,0-9。等价于[0-9]
  • 字符\D
    就是说包含所有的非数字字符。等价于[^0-9]
  • 字符\w
    就是说包含所有的数字字母下划线。等价于[0-9a-zA-Z_]
  • 字符\W
    就是说不包含数字字母下划线。等价于[^0-9a-zA-Z_]
  • 字符\s
    匹配所有的空字符,制表符,换行符,空格符等。
  • 字符\S
    匹配所有的非空字符。

正则表达式的常见修饰符

  • g
    全局匹配,匹配所有的符合条件的项。
  • i
    不区分大小写。(ignore)

正则表达式的方法

test方法

RegExp.test(String)//true/false
这个方法非常的简单。就是判断字符串是否能匹配正则表达式。如果匹配到了就返回true,没有匹配到就返回false。

var Reg = /abc/;
Reg.test('abcccc');//true
Reg.test('acccc');//false

exec方法

这个方法比较复杂,主要分为两种情况。

RegExp.exec(String);

首先,exec方法如果匹配到的话,就返回的是一个数组。如果没有匹配到就返回null.并且呢,这个数组比较的特别,他有三个额外的属性:

  • input
    这个呢,就是参与匹配的字符串.
  • index
    就是匹配到的字符串的index下标。
  • groups
    这个属性,要涉及到一个捕获组的概念,并且是具名捕获组的概念。

捕获组

捕获组,其实在正则表达式中,我的理解就是一个小括号就代表一个捕获组。比如说

var Reg = /(a)(b)(c)/;  //这里就有三个捕获组。a,b,c。

捕获组会导致什么效果呢?
捕获组会导致这样的效果:
数组的第一个元素也就是index:0的位置,是匹配到的那个字符串。而第二个元素也就是index:1的位置,她就是第一个捕获组匹配到的子字符串。依次类推。 就是下面的效果: 捕获组的顺序:
捕获组的顺序其实就是左半边括号的出现顺序。

具名捕获组

大家可能注意到,有一个groups属性永远等于undefined。这是因为这里面的内容是用来显示具名捕获组的。

具名捕获组的命名方式
(?<捕获组名>aaa)

他会在groups这个对象中,展示这个具名捕获组的匹配信息,属性名是捕获组名。属性值是捕获组匹配的字符串。

正则表达式全局与不全局匹配的两种情况

刚刚我说过这个exec方法比较特殊,它分为正则表达式全局匹配和不全局匹配的情况。 其实这个两种情况返回的结果是没差别的。
就是唯一一点不同就是,在不完全匹配的时候,它永远是返回第一个匹配到的对象的结果。而全局匹配会一直往后面进行匹配。找不到了就返回null
其实,本质就是全局匹配会将下一次开始的匹配位置也就是正则对象的lastIndex属性值设置成这次匹配到的字符串的最尾部的字符对应的index的下一个index(其实意思很简单,我表达得太绕了。)而不全局匹配的时候lastIndex值一直是0.所以它永远只会匹配第一个符合要求的子字符串,而全局匹配会一直往下面匹配,并且当他匹配不到符合条件的字符串的时候,就会返回null,并且将lastIndex置为0,千言万语抵不过一张图。 全局匹配: 不全局匹配: lastIndex,就是每次匹配开始的位置。
那这差不多就是正则对象的最基本知识了。后续复习了String的常用方法我还会总结一下String和RegExp的关联用法。