正则表达式

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式在线验证工具

修饰符

修饰符 含义 描述
i 不区分大小写
g 全局匹配 查找所有的匹配项
m 多行匹配 使^$匹配每一行的结尾,而不是匹配字符串的开头与结尾
s 特殊字符.包含换行符\n 默认情况下.是匹配除换行符\n之外的任何字符,加上s修饰符,可以匹配换行符\n

限定符

*、+、?、{n}、{n,}、{n,m}

a* 匹配a出现0次或多次

QQ截图20210321143149.png

a+ 匹配a出现1次或多次

QQ截图20210321143329.png

a? 匹配a出现0次或一次

QQ截图20210321143554.png

a{n} 匹配a出现n次

QQ截图20210321143800.png

a{n,} 匹配a至少出现n次

QQ截图20210321143946.png

a{n,m} 匹配a至少出现n次,最多出现m次

QQ截图20210321144236.png

或运算符

|

a|b 匹配a或者b

QQ截图20210321144613.png

(ab)|(cd) 匹配 ab或者cd

QQ截图20210321144735.png

字符类

[abc]、[^abc]、[a-z]、[A-Z]、[0-9]

[abc] 匹配方括号中的任意字符,a或者b或者c

QQ截图20210321145425.png

[^abc] 匹配除了方括号中的字符

QQ截图20210321145535.png

[a-z] 匹配小写字母a-z的所有字母

[A-Z] 匹配大写字母A-Z的所有字母

[0-9] 匹配0-9的所有数字

[a-zA-Z0-9] 匹配所有大小写字母以及0-9的所有数组

QQ截图20210321150006.png

元字符

\d、\D、\w、\W、\s、\S、.、\b、^、$

\d

匹配一个数字字符。等价于 [0-9]

\D

匹配一个非数字字符。等价于 [^0-9]

\w

匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'

\W

匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

.

匹配除换行符(\n、\r)之外的任何单个字符

\b

匹配一个单词边界,也就是指单词和空格间的位置

^

匹配输入字符串的开始位置

$

匹配输入字符串的结束位置

正则表达式中括号的作用

  • 分组和分支结构
  • 分组引用
  • 反向引用
  • 非捕获括号

分组和分支结构

  1. 分组

    //连续匹配两个 abc
    let reg = /(abc){2}/
    // ==> abcabc
  2. 分支结构

    //匹配 abc 或者 bcd
    let reg = /(abc|bcd)/
    //==> abcbcd

分组引用

  1. 提取数据

    比如:提取年月日

    let reg = /(\d{4})-(\d{2})-(\d{2})/
    let date = "2022-08-19"
    
    console.log(date.match(reg))
    

    image-20220819155706807

    match方法返回的是一个数组,第一个元素是整体匹配的结果,然后是各分组(括号内的)匹配的内容,索引,输入的内容等。另外,正则表达式是否有修饰符g,match返回的数组格式是不一样的。

  2. 替换

    比如,想把yyyy/mm/dd格式,替换成mm-dd-yyyy

    let reg = /(\d{4})\/(\d{2})\/(\d{2})/
    
    let date = "2022/08/19"
    
    date = date.replace(reg,"$2-$3-$1")
    
    console.log(date) // 08-19-2022

反向引用

还以日期格式为例,比如,要匹配 2022-08-19 或者 2022/08/09 ,中间分隔符可以是 - 或者是/,但是要保持一致

let reg = /\d{4}(-|\/)\d{2}\1\d{2}/

console.log(reg.test('2022-08/19')) //false
console.log(reg.test('2022-08-19')) //true
console.log(reg.test('2022/08/19')) //true

注意里面的\1,表示引用第一个分组(-|\/)。不管它匹配到什么,都匹配那个同样具体的字符

以此类推,\2 \3 的概念就能理解了

括号嵌套怎么办?

以左括号(开括号)为准。比如

let reg = /^((\d)(\d(\d)))\1\2\3\4$/

let str = '1231233'

console.log(reg.test(str))//true

非捕获符号

之前的括号,都会捕获它们匹配到的数据,以便后续引用,因此,也称它们是捕获型分组和捕获型分支。

如果只是想要括号原始的功能,但不会引用他,即不在API里引用,也不在正则里反向引用,此时,可以使用非捕获括号(?:p)(?:p1|p2|p3)