JavaScript正则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript正则相关的知识,希望对你有一定的参考价值。


创建正则

1 let reg1 = /^d+$/g;//=>字面量方式
2  let reg2 = new RegExp("^\d+$", "g");//=>构造函数方式

 

两个斜杠之间的是"元字符",斜杠后面出现的都是“修饰符”

常用元字符

特殊元字符:

  • d 0~9

  • w “数字、字母、下划线”中的任意一个

  • s 匹配任意一个空白字符(包括 制表符[TAB键四个空格])

  •  匹配边界符 ‘zhu‘(z左边和u右边就是边界) ‘zhu-feng‘(z左边、u右边、f左边、g右边是边界)

  • 匹配一个换行符

  • 转义字符(把一个普通字符转义为特殊的字符,例如:d,把有特殊含义的转换为普通意思

  • . 不仅仅是小数点,代表除了 以外的任意字符

  • ^ 以某个元字符开头

  • $ 以某个元字符结尾

  • [xyz] x或者y或者z中的任意一个

  • [^xyz] 除了xyz以外的任意字符

  • [a-z] 获取a-z中的任意一个字符([0-9] 等价于d ...)

  • () 正则分组

  • (?:) 当前分组只匹配不捕获

  • (?=) 正向预查

  • (?!) 负向预查

 

量词元字符(让其左边元字符出现多次)

  • ‘*‘ >=0

  • ‘?‘ [0,1]

  • ‘+‘ >=1

  • {n} n次

  • {n.} >=n次

  • {n,m} [n,m]

 

普通元字符

  • 只要在正则中出现的元字符(在基于字面方式创建),除了特殊和有量词意义的以外,其余的都是普通元字符

中括号的一些细节

  • 中括号中出现的元字符一般都是代表本身含义的

  • 中括号中出现的两位数,不是两位数,而是两个数字中的任意一个

    let reg = /^[12-65]$/;//这个正则的意思是 1或者2~6或者5

分组的作用

  • 改变的默认的优先级

  • 分组捕获

  • 分组引用

正则捕获exec

  • 如果当前正则和字符串不匹配,捕获的结果是NULL

  • 如果匹配,捕获的结果是一个数组

  • 0:大正则捕获的内容,后面的数字索引是匹配到的分组内容

  • index:正则捕获的起始索引

  • input:原始操作的字符串

  • EXEC只能捕获到第一个和正则匹配的内容(正则捕获的懒惰性,解决正则捕获的懒惰性,我们需要加全局修饰符G)

    let reg=/(d+)abc/g;
    console.log(reg.exec(‘12abc23abc34‘));
    console.log(reg.exec(‘12abc23abc34‘));
    /* ["12abc", "12", index: 0, input: "12abc23abc34", groups: undefined]
    0: "12abc"
    1: "12"
    groups: undefined
    index: 0
    input: "12abc23abc34"
    length: 2
    __proto__: Array(0)
    --------------------------------------------------------------------------
    ["23abc", "23", index: 5, input: "12abc23abc34", groups: undefined]
    0: "23abc"
    1: "23"
    groups: undefined
    index: 5
    input: "12abc23abc34"
    length: 2
    __proto__: Array(0)*/

字符串匹配正则match

不加‘g‘:

let reg=/d+/;
let str=‘12abc23abc34‘;
console.log(str.match(reg));
/*和正则捕获exec的结果一样
["12", index: 0, input: "12abc23abc34", groups: undefined]
0: "12"
groups: undefined
index: 0
input: "12abc23abc34"
length: 1
__proto__: Array(0)
 */

加‘g‘:

let reg=/d+/g;
let str=‘12abc23abc34‘;
console.log(str.match(reg));
/*
(3) ["12", "23", "34"]
0: "12"
1: "23"
2: "34"
length: 3
__proto__: Array(0)
 */

replace

  • reg和 str匹配多少次,函数就被触发执行对少次,基于exec把每一次正则匹配到结果中的每一项,传递给函数执行

  • 每一次函数中返回的是啥,就把当前大正则匹配的内容替换成啥

    let reg=/(d+)abc/g;
    let str=‘12abc23abc34‘;
    str=str.replace(reg,(...arg)=>{
        console.log(arg);/*匹配到两次
        ["12abc", "12", 0, "12abc23abc34"]
        ["23abc", "23", 5, "12abc23abc34"]
        */
        return ‘haha‘;
    });
    console.log(str);//hahahaha34

正则捕获贪婪性

正则捕获还具备贪婪性:每一次匹配捕获的时候,总是捕获到和正则匹配中最长的内容,把问号放到量词元字符后面,代表的就不是出现零次或者一次了,而且取消捕获的贪婪性

一些常用正则

  • 有效数字

    /^[+-]?(d|([1-9]d+))(.d+)?$/
  • 电话号码

    /^1d{10}$/
  • 中文姓名

    /^[u4E00-u9FA5]{2,}(·[u4E00-u9FA5]{2,})?$/
    
  • 邮箱

    /^w+([-.]w+)*@[A-Za-z0-9]+([-.][A-Za-z0-9]+)*(.[A-Za-z0-9]+)$/

以上是关于JavaScript正则的主要内容,如果未能解决你的问题,请参考以下文章

javascript正则表达式

JavaScript之基础-10 JavaScript 正则表达式(概述定义正则RegExp对象用于模式匹配的String方法)

JavaScript中的正则表达式

JavaScript 中使用正则表达式

javascript JavaScript正则表达式

javascript Javascript正则表达式输入限制