美文网首页
JS正则表达式

JS正则表达式

作者: 夏知更 | 来源:发表于2019-05-07 16:14 被阅读0次

    前言

    关于正则表达式,一直以其难学程度且适用场景有限而敬而远之,偶然看到一篇关于正则的文章,产生兴趣,因此记录一下学习笔记,方便日后查阅。

    一、正则表达式

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,许多程序设计语言都支持利用正则表达式进行字符串操作。

    主要有两种操作:匹配和捕获

    正则表达式的创建:
    正则表达式是有元字符和修饰符组成,将元字符和修饰符写在/ /

    基础笔记:

    元字符:
    \: 转义字符
    ^: 以某一个元字符开始
    $: 以某一个元字符结束
    \n: 匹配一个换行
    .:除了\n以外的任意字符
    (): 分组
    x|y: x或者y中第一个
    [xyz]:x或者y或者z中的一个
    [^xyz]:除了三个以外的任意一个字符
    [a-z]:a 和 z 之间的任意字符
    [^a-z]:除了a 和 z 之间的任意字符
    \d:表示 0-9 之间的数字
    \D:除了0-9之间的数字以外的任意字符
    \b:匹配一个边界符 w1 w2
    \w:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
    \s:匹配一个空白字符 空格、一个制表符、换页符...

    二、正则精准匹配

    精准匹配是指匹配字符串中的某个子串,使用test()方法,匹配某个模式,返回true/false

    • 单个匹配模式
    let testString = 'test string,for reference only';
    let testRegex = /reference/;
    let testResult = testRegex.test(testString);
    console.log(testResult);     //true
    
    • 多个匹配模式
      使用操作符号 |匹配多个字符串
    let testString = 'test string,for reference only';
    let testRegexMore = /test|for|only/;
    let testMore = testRegexMore.test(testString);
    console.log(testMore);      //true
    

    三、模糊匹配

    精准匹配只能匹配字符串中的某个子串,正则表达式之所以强大,是因为其能实现模糊匹配,满足更多的应用场景,使用match()完成

    console.log('Cad cAd caD CAd CaD cAD'.match(/cad/gi));  
    // [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
    
    • 匹配任意字符
      正则使用.完成任意字符的匹配
    console.log('Cad cAd caD CAd CaD cAD'.match(/.ad/gi));
    // [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
    
    • 匹配数量

    量词元字符(数量元字符)
    * :出现零到多次
    +:出现一到多次
    :出现零次或者一次
    {n}:出现 n 次
    {n,}:出现 n 到多次
    {n,m}:出现 n 到 m 次

    标志字符
    g:全局搜索,记忆方式 global
    i:不区分大小写,记忆方式 ignore
    m:多行搜索

    1. 出现零到多次

    console.log('hi'.match(/hi*/gi));    //[ 'hi' ]
    console.log('hiiiiiiii'.match(/hi*/gi));   //[ 'hiiiiiiii' ]
    console.log('hiihihi'.match(/hi*/gi));   //[ 'hii', 'hi', 'hi' ]
    

    2. 出现一到多次

    let matchMoreStr = "Tallahassee";
    console.log(matchMoreStr.match(/s+/gi));     // [ 'ss' ]
    console.log(matchMoreStr.match(/a+/gi));     //[ 'a', 'a', 'a' ]
    

    3. 出现零次或者一次

    console.log((/colou?r/i).test('colour'));   // true
    console.log((/colou?r/i).test('Color'));     // true
    console.log((/colou?r/i).test('Colouuur'));     // false
    

    4. 出现指定次数

    let matchStr = "cde cdde cddde cdddde cddddde";
    let matchReg = /cd{3,5}e/g;
    console.log(matchStr.match(matchReg));      // [ 'cddde', 'cdddde', 'cddddde' ]
    console.log(matchStr.match(/cd{1}e/g));       // [ 'cde' ]
    console.log(matchStr.match(/cd{1,}e/g));      // [ 'cde', 'cdde', 'cddde', 'cdddde', 'cddddde' ]
    
    • 匹配一组字符
      使用[]匹配一组字符
    console.log('bat cst sat dat eat at act'.match(/[bde]at/gi));     // [ 'bat', 'dat', 'eat' ]
    console.log('bat cst sat eat dat at act'.match(/[a-e]at/gi));     // [ 'bat', 'eat', 'dat' ]
    
    • 匹配一组不想拥有的字符
      匹配不想拥有的一组字符,需要使用否定字符集^
    let notVowels = /[^aeiou]/gi;
    console.log('nameasasasasa'.match(notVowels));   // [ 'n', 'm', 's', 's', 's', 's' ]
    
    • 匹配字母
    console.log('Bat cst sat eat dat at act'.match(/[a-z]at/g));    // [ 'sat', 'eat', 'dat' ]
    console.log('Bat cst sat eat dat at act'.match(/[A-Z]at/g));    // [ 'Bat' ]
    console.log('Bat cst sat eat dat at act'.match(/[a-zA-Z]at/g));   //[ 'Bat', 'sat', 'eat', 'dat' ]=
    
    • 匹配数字/非数字
      可以使用字符集[0-9],或者使用简写\d
      \D表示 \d的反义
    console.log('Bat1929287373 cst sat eat dat at act'.match(/[0-9]/g));    
    // [ '1', '9', '2', '9', '2', '8', '7', '3', '7', '3' ]
    
    console.log('Bat1929287373 cst'.match(/\D/g));
    // [ 'B', 'a', 't', ' ', 'c', 's', 't' ]
    
    • 匹配所有的字母和数字
      可以使用\word 简写,\w
    console.log(/[A-Za-z0-9_]+/.test('42asas'));
    console.log(/\w+/.test('name32'));
    
    • 匹配所有的非字母和非数字
      \W表示\w的反义
    console.log(/\W+/g.test('%^^&'));
    console.log(/\W+/.test('name32'));
    

    -匹配空格/非空格
    使用 \s来匹配空格和回车符
    \S表示\s的反义

    console.log('Love you three thousand'.match(/\s/g));    //[ ' ', ' ', ' ' ]
    console.log('Love you three thousand'.match(/\S/g));
    // [ 'L', 'o','v', 'e','y','o','u','t','h','r','e','e','t','h','o','u','s','a','n','d' ]
    
    • 匹配起始字符串
      匹配起始字符串,使用插入符号^,但要放到开头,放到字符集中间匹配不到
    console.log('Love you three thousand'.match(/^Love/g));    //[ 'Love' ]
    console.log('Love you three thousand'.match(/^you/g));     //null
    
    • 匹配结束字符串
      使用$来判断字符串是否是以规定的字符结尾
    console.log('Love you three thousand'.match(/thousand$/g));    //[ 'thousand' ]
    console.log('Love you three thousand'.match(/three$/g));    //null
    

    四、惰性匹配

    默认情况下,正则表达式是贪婪的(匹配满足给定要求的字符串的最长部分),但是一般情况下,我们只需要字符串中与给定要求匹配的最小部分,因此需要阻止正则表达式的贪婪匹配
    使用 ?阻止贪婪模式(惰性匹配 )

    console.log('catnamebatdat'.match(/c[a-z]*t/gi));     //[ 'catnamebatdat' ]
    console.log('catnamebatdat'.match(/c[a-z]*?t/gi));    //['cat' ]
    

    相关文章

      网友评论

          本文标题:JS正则表达式

          本文链接:https://www.haomeiwen.com/subject/rtrmnqtx.html