• JavaScript正则表达式


    RegExp - 正则表达式(Regular Expression)也叫规则表达式,是一个复杂数据类型(object)。

    作用

    1、专门用来验证字符串是否符合规则
    2、从字符串里面获取一部分符合规则的内容

    正则表达式的创建

    1、字面量创建

    const reg=/abc/
    

    2、内置构造函数创建

    const reg=new RegExp('abc')
    

    两种创建方式的区别:
    1)语法不同
    2)字面量创建不能进行字符串拼接,内置构造函数可以进行字符串拼接
    3)书写基础元字符的区别:字面量创建的可以直接 \d,内置构造函数需要 \d

    正则表达式的两个方法

    1、匹配
    验证字符串是不是符合正则规则
    语法:正则.test(你要检测的字符串),返回值是一个布尔值,符合返回true,不符合返回false
    2、捕获
    从字符串里面获取符合正则规则的那一部分片段
    语法:正则.exec(你要捕获的字符串)
    返回值:字符串里面没有符合规则的片段返回null
    字符串里面有符合规则的片段,如果是基础捕获,返回值是一个数组,数组的第一项是捕获的片段,不管有多少片段,都只捕获第一个片段,不管捕获多少次,都是第一个片段.

    正则表达式元字符

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

    基础元字符

    \s 表示一个空格
    \S 表示一个非空格
    \t 表示一个制表符(tab),一个制表符,不是多个空格
    \d 表示一个数字
    \D 表示一个非数字
    \w 表示一个 数字 或者字母 或者下划线
    \W 表示一个 非 数字或者字母或者下划线,数字或者字母或者下划线以外的字符
    . (点) 表示非换行的任意字符(字符串中\n表示换行)
    \(斜线) 表示转义符,把没有意义的内容转换成有意义的内容,把有意义的内容转换成没有意义的内容
    

    边界元字符

    ^ 表示字符串的开始
    $ 表示字符串的结束
    

    限定元字符

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

    * 表示出现0到多次
    + 表示出现1到多次
    ?表示0次或1次
    {n} 表示出现n次,n前后不能有空格
    {n,} 表示出现n到多次,只是出现n次
    {n,m} 表示出现n到m次
    

    正则的贪婪和非贪婪

    贪婪性:
    当你给一个符号使用限定符的时候,在你捕获的时候,会尽可能多的去捕获内容,我们管这个特效叫做正则的贪婪性

    非贪婪性
    正则在捕获的时候尽可能的按照最小来捕获(写限定符的时候,在后面多加一个?号)

    +?
    const reg=/\d+/
    reg.exec('ab12345cd') //在捕获的时候会尽可能捕获最大长度,12345
    const reg=/\d+?/
    reg.exec('ab12345cd') //在捕获的时候会按照最小数量捕获,1
    
    *?
    const reg=/\d*/
    reg.exec('121345') //捕获 12345
    const reg=/\d*?/
    reg.exec('121345') //捕获 没有
    
    ??
    const reg=/\d?/
    reg.exec('121345') //捕获 1
    const reg=/\d??/
    reg.exec('121345') //捕获 没有
    
    一下都是捕获n个,按最少的捕获
    {n}?
    {n,}?
    {n,m}?
    

    特殊元字符

    ()小括号,表示一个整体或者单独捕获。单独捕获的时候,从左边开始依次捕获小括号内容。
    一个整体
    //表示abc这个整体出现两次

    const reg=/(abc){2}/  //abcabc
    

    单独捕获

    const reg=/\d+(\s+)\d+/   //单独捕获小括号内容,多个空格
    const reg=/(\d+(\s))\d+/  //先捕获外面小括号内容,再捕获里面小括号内容
    

    (?:)整体匹配但不捕获,只是标志一个整体,但是捕获的时候不会单独捕获出来

    const reg=/\d+(?:\s+\d+){2}/  //小括号里面当成一个整体,但不捕获
    

    | 占位或,表示左边或者右边都行,分开的是|左边或者右边整体,大部分时候和()连用,表示一个整体或另一个整体

    const reg=/(abc|def)/
    const reg=/^abc|def$/
    

    [] 表示里面的任意一个都行,注意是一个,只匹配里面的任意一个。
    const reg=/[abcd]/ 匹配abcd的任意一个

    [^] 表示非里面的任意一个都行,也是一个。

    const reg=/[^abcd]/   表示你的字符串要由一个字符组成,只要不是abcd中的任意一个就可以
    
    • 表示 至 或者 到,是使用再[] 里面的一个符号,表示从一个字符到另一个字符,前提是他们在ASCII码是连着的
    const reg=/^[0-9]$/   表示0到9任意一个数字
    const reg=/^[a-z]$/
    const reg=/^[A-Z]$/
    

    组合形式

    [0-9a-zA-Z_]  等价于 \w
    [^0-9a-zA-Z_]  等价于 \W
    [0-9]  等价于 \d
    [^0-9]  等价于 \D
    [ ] 等价于 \s
    [^ ] 等价于 \S
    

    特殊说明,当点这符号(.)出现在[]或者[^]里面的时候表示一个点文本,不再表示非换行任意字符,而是表示他本身

    正则表达式的预查

    正向预查
    正向肯定预查
    当在捕获一个内容的时候,后面必须跟着是我选择的某一个才可以 ,符号问等(?=)
    正向否定预查
    当在捕获一个内容的时候,后面必须跟着不是我选择的某一个才可以,符号问叹 (?!)
    负向预查
    负向肯定预查
    当在捕获一个内容的时候,前面必须是我选择的某一个才可以,符号 (?<=)
    负向否定预查
    当在捕获一个内容的时候,前面必须不是我选择的某一个才可以,符号 (?<!)

    1.正向肯定预查

    //字符串 ES20015 或者ES2016 可以捕获,但只捕获ES,不需要2015或者2016
    const reg=/ES(?=2015|2016)/
    console.log(reg.exec('ES2015'))
    console.log(reg.exec('ES2016'))
    

    2.正向否定预查

    const reg=/ES(?!2015|2016)/
    

    3.负向肯定预查

    const reg=/(?<=2015|2016)ES/
    console.log(reg.exec('2015ES'))
    

    4.负向否定预查

    const reg=/(?<!2015|2016)ES/
    

    重复出现

    \num ,num表示一个正整数,比如\1\2,num是一个数字,表示正则第num个可被捕获的小括号(),这个可被捕获的小括号位置是什么,就出现一份一模一样的内容
    //表示重复出现第一个小括号,一模一样的内容一遍

    const reg=/(abc|def)\d+\1/
    console.log(reg.test('abc123abc'))  //true
    console.log(reg.test('abc123def'))  //false
    

    正则表达式的标识符

    标识符是写在正则表达式的外面,用来修饰整个正则表达式的,由三个标识符
    i 忽略大小写
    g 全局
    y 粘性全局
    语法 /正则/igy 或者 new RegExp('正则','igy')
    1.忽略大小写

    const reg=/[abc]/i
    

    2.全局

    const str='abc123abc456abc789'
    const reg=/\d{3}/  只能匹配和捕获的时候,都只能找到第一个,123
    

    当有全局标识符的时候,捕获第二次会从第一次的结束位置开始查找,直到找不到了,返回null,再后面,又回到【0】位置开始捕获,中途进行匹配或者捕获都是影响下一次开始的位置。

    const reg=/\d{3}/g  //多次匹配就可以匹配到 123  456  789
    console.log(reg.exec(str))  //结束位置是 [5],捕获123
    console.log(reg.exec(str))  //开始位置是 [6],捕获456,以此类推
    

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

    const str='123456abc'
    const reg=/\d{3}/y
    console.log(reg.exec(str))  //123
    console.log(reg.exec(str))  //456
    如果 str='abc123',就匹配不到
    

    正则表达式的两个方法

    1. test() 匹配,验证字符串是不是符合正则规则
      语法:正则.test(要检测的字符串)
      返回值:一个布尔值,符合为true,不符合为false

    2. exec()捕获,从字符串里面获取符合正则规则的那一部分片段,
      语法:正则.exec(要捕获的字符串)
      返回值:
      1.字符串里面没有符合规则的片段返回null
      2.字符串里面有符合规则的片段,
      1)基础捕获。返回值是一个数组,[0]项是捕获出来的片段,不管有多少个片段,都只是捕获第一个片段,不管捕获多少次,都是第一个片段
      2)当正则表达式有小括号()的时候
      返回值是一个数组,从索引[1]开始一次是每一个小括号的单独捕获
      3)当正则有全局标识符g的时候
      第二次捕获会从第一次捕获的结束位置开始继续向后查找,直到找不到为止,返回null,再后面一次捕获,依旧会从[0]位置开始查找

    字符串和正则合作的方法

    这些方法都是字符串的常用方法,只不过参数位置可以写正则。
    1.search()
    语法:
    字符串.search(字符串片段)
    字符串.search(正则表达式)
    返回值:
    如果找到就返回对应的索引,没有就返回 -1

    const str='sbc123dfg'
    console.log(str.search('123'))
    console.log(str.search(/\d{3}/))
    

    2.replace()
    语法:
    字符串.replace(字符串片段,要替换的内容)
    返回值,只能替换第一个查找到的内容,返回替换后的字符串
    字符串.replace(正则表达式,要替换的内容)
    返回值:没有全局标识符g的时候,只能替换第一个查找到的内容,返回替换后的字符串
    有全局标识符g的时候,会把字符串内所有满足正则规则的内容全部替换,返回替换好的字符串

    3.match()
    语法:
    字符串.match(字符串片段)
    字符串.match(正则表达式)
    返回值:查找到字符串内一个满足字符串片段的内容返回,返回格式和exec一模一样
    当正则表达式没有全局标识符g的时候,返回值和exec一模一样
    当正则表达式有全局标识符g的时候,返回一个数组,里面是所有满足条件的内容

    const str='hello 你好 world hello 你好 world'
    console.log(str.match('你好'))
    console.log(str.match(/你好/))
    console.log(str.match(/你好/g))
    

    正则匹配中文

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

    const str='hello 你好 world hello 你好 world'
    console.log(str.match(/[\u4e0-\u9fa5]+/g)) //表示任意几个中文
    
  • 相关阅读:
    038 Count and Say 数数并说
    037 Sudoku Solver 解数独
    036 Valid Sudoku 有效的数独
    035 Search Insert Position 搜索插入位置
    bzoj1202 [HNOI2005]狡猾的商人
    USACO45 lights 电灯(折半搜索)
    USACO44 TimeTravel 时间旅行(链表)
    USACO35 翻转奶牛(尺取法)
    bzoj1833: [ZJOI2010]count 数字计数&&USACO37 Cow Queueing 数数的梦(数位DP)
    USACO26 moofest 奶牛集会(归并排序)
  • 原文地址:https://www.cnblogs.com/qingheshiguang/p/16490791.html
Copyright © 2020-2023  润新知