正则表达式

138 阅读7分钟

正则表达式

正则RegExp

正则表达式也叫规则表达式,使用一些特定的符号来组合成一个表达式,使用这个表达式去验证字符串是否符合规则(匹配),或者从字符串里面获取一些符合规则的内容(捕获)。例如:var reg = /abcd/ 正则表达式就是要验证字符串里是否包含一段abcd字母。

创建

  1. 字面量形式创建
    1. 语法:const regex = /foo/g typeof => 'object'
    2. 不能进行字符串拼接,字符串拼接完毕就变成了字符串不是正则,不能使用test和exec方法
    3. 书写基础元字符的时候直接写\x
  2. 内置构造函数创建
    1. 语法:const regex = new RegExp('foo*') typeof => 'object'
    2. 可以进行字符串拼接,因为RegExp的第一个参数就是传递一个字符串类型
    3. 书写基础元字符的时候需要写\x

标识符

标识符是写在正则表达式的外面,用来修饰整个正则表达式的const reg = /abcd/igyconst reg = new RegExp('abcd', 'igy')

  1. i:忽略大小写。

  2. g:全局。匹配或捕获的时候,都是只能找到第一个。当他有全局标识符的时候,你捕获第二次会从第一次的结束位开始查找,直到找不到了返回null,再后面依次的时候,又回到[0]位置开始捕获。匹配和捕获都是影响下一次开始位的。

    image.png

  3. y:粘性全局。第一次必须是从[0]位置就刚好能捕获到内容,第二次必须是从第一次结束位开始就刚好能捕获到内容才可以。

转义符

字符串里的转义字符也是\:

  1. 当你在字符串里书写n的时候表示文本n,当书写\n的时候表示换行的意思;
  2. 当你在字符串里书写\s的时候,他会把s转换成有意义的内容,但是\s确实没有实际意义,就变成了一个普通文本;
  3. 当你在字符串里书写\的时候表示转义符号,当你在书写\的时候,表示一个\文本;

作用

  1. 匹配:验证字符串是否符合规则;
    1. 语法:正则.test(你要检测的字符串)const str = 'table football';const regex = new RegExp('foo*');//该regex的意思表示字符串str里面需要有一个foo*片段
    2. 返回值:一个布尔值,true或者falseconsole.log(regex.test(str)); // expected output: true
  2. 捕获:从字符串里面获取符合正则规则的那一部分片段;
    1. 语法:正则.exec(你要捕获的字符串)
    2. 返回值:
      1. 字符串里面没有符合规则的片段时返回:null
      2. 字符串里有符合规则的片段-基础捕获:返回值是一个数组,其中[0]是捕获出来的片段(不管有多少片段,都只捕获第一个片段;不管捕获多少次,都是第一个片段)
      3. 字符串里有符合规则的片段-()捕获:返回值是一个数组,从索引[1]开始依次是每一个小括号的单独捕获
      4. 字符串里有符合规则的片段-g标识符:第二次捕获会从第一次捕获的结束为开始继续向后查找,直到找不到了位置返回null,再后面依次捕获,依旧会从[0]位置开始查找

元字符

元字符-基础元字符

元字符:组成正则的基本符号。以符号的形式来代替文本内容,把所有的文本内容归结成一些符号来代替。

  1. \s:表示一个空格
  2. \S:表示一个非空格
  3. \t:表示一个制表符
  4. \d:表示一个数字字符
  5. \D:表示一个非数字字符
  6. \w:表示包含一个数字或字母或下划线字符
  7. \W:表示包含一个非数字或字母或下划线字符
  8. 点(.):表示非换行的任意字符
  9. 斜线():表示转义符(把没有意义的内容转换成有意义的内容;把有意义的内容转换成没有意义的内容。例如s单纯表示字母s,\s就表示空格了;.表示非换行的任意字符,.表示字符.;\表示转义字符,\才表示斜线)

元字符-边界元字符

  1. ^:表示字符串开始
  2. $:表示字符串结尾

元字符-限定元字符

限定元字符写在普通元字符或者字母符号的后面,修饰前面一个符号的出现次数。

  1. *:表示0到多次
  2. +:表示1到多次
  3. ?:表示0或1次
  4. {n}:表示n次
  5. {n,}:表示n到多次
  6. {n,m}:表示n到m次

贪婪和非贪婪(?)

当你给一个符号使用限定符的时候,在你捕获的时候,他会尽可能多的去捕获内容,我们管这个特性叫做正则的贪婪性const reg = /\d+/ 正则在捕获的时候尽可能的按照最小值来捕获,写限定符的时候,在后面多加一个**?表示非贪婪**。const reg = /\d+?/;其中,+?是一个字符

  1. *?
  2. +?
  3. ??
  4. {n}?
  5. {n,}?
  6. {n,m}?

元字符-特殊字符

  1. ():一是代表一个整体const reg = /(abcd){2}/; // => 匹配abcdabcd;再有就是单独捕获(在你捕获一个字符串的时候,从左边开始每一个小括号依次是数组里面的[1]开始的内容,从左到右依次数小括号的开始括号)const reg = /(\d+(\s+))(\d+)/
  2. (?:):整体匹配但不捕获,只是标志一个整体,但是捕获的时候不会单独捕获出来;const reg = /\d+(?:\s+\d+){2}/; reg.exec('123 123 123');
  3. |:占位或,表示左边或者右边的都行,大部分时候和()连用表示一个整体或一个整体,或分开的是左边的整体或右边的整体const reg = /(abc|def)/``const reg = /^abc|def$/
  4. []:一个[]占一个字符位置,表示里面的任意一个都行
  5. [^]:一个[^]占一个字符位置,表示非里面的任意一个都行
  6. -:表示至或者到,是使用在[]里面的一个字符,表示从哪一个到哪一个字符,前提是他们在他们在ASCII码里是挨着的。

组合形式:

  1. [0-9a-zA-Z_]:等价于\w
  2. [^0-9a-zA-Z_]:等价于\W
  3. [0-9]:等价于\d
  4. [^0-9]:等价于\D
  5. [ ]:等价于\s
  6. [^ ]:等价于\S

特殊说明: 当点(.)出现在[]或者[^]里面的时候,表示一个点文本,不再表示非换行符

重复出现

\num:num是一个正整数,例如\1 \2 \3...,num是一个数字,表示的是正则第num个可被捕获的() 这个可被捕获的小括号位置是什么 出现 一份 一模一样的内容

// \1 表示重复出现第一个()一模一样的内容一遍
const reg = /(abc|def)\d+\1/
reg.test('abc123abc') // true
reg.test('abc123def') // false

预查

正向预查

正向肯定预查

当我在捕获一个内容的时候,后面必须跟着是我选择的某一个才行(?=)

正向否定预查

当我在捕获一个内容的时候,后面必须跟着不是我选择的某一个才行(?!)

负向预查

负向肯定预查

当我在捕获一个内容的时候,前面必须是我选择的一个才可以(?<=)

负向否定预查

当我在捕获一个内容的时候,前面必须不是我选择的某一个才行(?<!)

例子

‘ES2015 ES2016 ES2017 都是 JavaScript 的语法标准’ 1.正向肯定预查:我要捕获 后面必须写着 2015 或者 2016 的ES,字符串是 ES2015 或者 ES2016 是可以捕获的,但是我只捕获 ES 不需要 2015 或者 2016 const reg = /ES(?=2015|2016)/

字符串和正则合作的方法

这些方法都是字符串的常用方法,只不过参数位置可以写正则。

  1. search()
    1. 语法:
      1. 字符串.search(字符串片段)
      2. 字符串.search(正则表达式)
    2. 返回值:
      1. 如果有就是对应的索引
      2. 如果没有就是-1
  2. replace()
    1. 语法:
      1. 字符串.replace(字符串片段,要替换的内容)
      2. 字符串.replace(正则表达式,要替换的内容)
    2. 返回值:
      1. 为字符串片段时:只能替换第一个查找到的内容,返回替换好的字符串
      2. 为正则时:如果没有全局标识符g的时候,只能替换第一个查找到的内容,返回替换好的字符串;有全局标识符g的时候,会把字符串内所有满足正则规则的内容全部替换,返回替换好的字符串
  3. match()
    1. 语法:
      1. 字符串.match(字符串片段)
      2. 字符串.match(正则表达式)
    2. 返回值:
      1. 为字符串片段时:查找到字符串内一个满足字符串片段的内容返回,返回格式和exec一模一样
      2. 为正则时:如果没有全局标识符g的时候,返回值和exec方法一模一样;有全局标识符g的时候,返回一个数组,里面是所有满足条件的内容

正则匹配中文

在正则表达式里面\u表示查找中文,后面带上中文的四位unicode编码,[\u4e00-\u9fa5]表示任意一个中文字符。