正则表达式整理

169 阅读3分钟

正则表达式使用场景很广泛,比如Vue中模板编译部分就使用了大量的正则表达式,还有平常使用较多的表单校验部分,相比于一大串的if else,实现会优雅一些

整理正则表达式还是正常三步骤,是什么,表现形式(有什么特点),有什么用

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式

正则表达式由一些普通字符(例如,a 到 z 之间的字母)和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

正则表达式常用来描述、匹配符合某个句法规则的字符串,如常见的用户输入表单校验。

构造正则表达式的方法和创建数学表达式的方法一样,用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。一个正则表达式是一种从左到右匹配主体字符串的模式。

下面从几种不同的场景整理学习一些元字符及正则表达式

使用正则表达式

基础元字符

元字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符
\w 匹配字母、数字、下划线
\d 匹配一个数字
\D 匹配一个非数字
\s 匹配任意的空白字符。
\b 匹配一个单词边界(单词的开始或结束)
. 匹配除换行符以外的字符

如:

'&kilig.xyz'.match(/\w/)
// ["k", index: 1, input: "&kilig.xyz", groups: undefined]


'&kilig.xyz01'.match(/\d/)
//["0", index: 10, input: "&kilig.xyz01", groups: undefined]




'&kilig.xyz01'.match(/\D/)
//["&", index: 0, input: "&kilig.xyz01", groups: undefined]




'&kilig.xyz01 '.match(/\s/)
//[" ", index: 12, input: "&kilig.xyz01 ", groups: undefined]




'&kilig.xyz01 '.match(/\b/)
//["", index: 1, input: "&kilig.xyz01 ", groups: undefined]


 

限定符

  1. 区间(字符范围)
    元字符 描述
    ^ 匹配字符串的开始
    $ 匹配字符串的结束
    [] 匹配满足区间条件的字符吗,[0-9],[a-z],[123]
    [^] 匹配除了方括号里的任意字符


    '&kilig.xyz01 '.match(/^k/)
    '&kilig.xyz01 '.match(/^k/)
    
    
    //null
    //["k", index: 0, input: "kilig.xyz01 ", groups: undefined]
    
    
    
    
    'kilig.xyz01'.match(/k/)
    'kilig.xyz01'.match(/1/)
    
    
    
    
    //null
    //["1", index: 10, input: "kilig.xyz01", groups: undefined]
    
    
    
    
    'kilig.xyz01'.match(/[a-k]/)
    'kilig.xyz01'.match(/[a-k]/g)
    
    
    
    
    //["k", index: 0, input: "kilig.xyz01", groups: undefined]
    //(4) ["k", "i", "i", "g"]
    
    
    

     

重复限定

元字符 描述
* 重复零次或多次
+ 至少重复一次
? 重复零次或一次
{n} 重复n次
{n,} 至少重复n次
{n,m} 重复n到m次

 


'kilig.xyz0101'.match(/(01){2}/)
//(2) ["0101", "01", index: 9, input: "kilig.xyz0101", groups: undefined]


'kilig.xyz01010101'.match(/(01){2,}/)
//(2) ["01010101", "01", index: 9, input: "kilig.xyz01010101", groups: undefined]




  1. 条件或
    'kilig.xyz01012323'.match(/(01){2,}|(23){2,}/)
    'kilig.xyz01012323'.match(/(01){2,}|(23){2,}/g)
    
    
    //(3) ["0101", "01", undefined, index: 9, input: "kilig.xyz01012323", groups: undefined]
    //(2) ["0101", "2323"]
    
    
    

    .

零宽断言

零宽断言,指的是匹配满足一定规则的内容的位置(不返回内容本身,只匹配位置)。当指定位置的之前或之后的字符满足限定规则时匹配成功,分为以下四种:

  1. 正先行断言
    形式:?=...
    规则:表示第一部分表达式之后必须跟着 ?=... 定义的表达式。
    
    'kilig.xyz01012323'.match(/i(?=g)/)
    //["i", index: 3, input: "kilig.xyz01012323", groups: undefined]
    
    
    'kilig.xyz01012323'.match(/i(?=l)/)
    //["i", index: 1, input: "kilig.xyz01012323", groups: undefined]
    
    
    
    
    ​

  2. 负先行断言
    形式:?!...
    规则:用于筛选所有匹配结果,筛选条件为其后不跟随着断言中定义的格式。
    
    'kilig.xyz01012323'.match(/i(?!l)/)
    //["i", index: 3, input: "kilig.xyz01012323", groups: undefined]
    
    
    'kilig.xyz01012323'.match(/i(?!g)/)
    //["i", index: 1, input: "kilig.xyz01012323", groups: undefined]
    
    
    
    
    ​

  3. 正后发断言
    形式:?<= ...
    规则:用于筛选所有匹配结果,筛选条件为其前跟随着断言中定义的格式。
    
    'kilig.xyz01012323'.match(/(?<=l)i/)
    //["i", index: 3, input: "kilig.xyz01012323", groups: undefined]
    
    
    'kilig.xyz01012323'.match(/(?<=k)i/)
    //["i", index: 1, input: "kilig.xyz01012323", groups: undefined]
    
    
    

  4. 负后发断言
    形式:?<!...
    规则:用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
    
    'kilig.xyz01012323'.match(/(?<!l)i/)
    //["i", index: 1, input: "kilig.xyz01012323", groups: undefined]
    
    
    'kilig.xyz01012323'.match(/(?<!k)i/)
    //["i", index: 3, input: "kilig.xyz01012323", groups: undefined]