• JavaScript正则表达式


    JavaScript的正则表达式

    一、使用方式简单介绍:

    1.字面量
    (1)

    let reg = /is/;
    let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
    layer.alert(test.replace(reg, 'IS'));
    

    结果:

    She IS a beautiful girl.He is a handsome boy.You are a dog.
    

    (2) 这里只替换了第一个is,如果要全局替换,在后面加个g

    let reg = /is/g;
    let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
    layer.alert(test.replace(reg, 'IS'));
    

    结果:

    She IS a beautiful girl.He IS a handsome boy.You are a dog.
    

    2.构造函数
    (1)

    let reg = new RegExp('\bis\b');
    let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
    layer.alert(test.replace(reg, 'IS'));
    

    结果:

    She IS a beautiful girl.He is a handsome boy.You are a dog.
    

    (2) 如果要全局替换,在后面加个g

    let reg = new RegExp('\bis\b', 'g');
    let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
    layer.alert(test.replace(reg, 'IS'));
    

    结果:

    She IS a beautiful girl.He IS a handsome boy.You are a dog.
    

    匹配符:

    • g : global全局搜索,默认不添加,匹配到第一个停止
    • i : ignore case忽略大小写,默认大小写敏感
    • m : multiple lines多行搜索

    二、元字符

    • 应注意这些  *  +  ?  $  ^  .  |  (  )  {  }  [  ]

    三、字符类

    1.将abc中任意字符替换成M

    let reg = /[abc]/g;
    let test = '1a2b3c4d';
    layer.alert(test.replace(reg, 'M'));
    

    结果:

    1M2M3M4d
    

    2.取反,除了abc以外的所有字符都替换成M

    let reg = /[abc]/g;
    let test = '1a2b3c4d';
    layer.alert(test.replace(reg, 'M'));
    

    结果:

    MaMbMcMM
    

    四、范围类

    let reg = /[a-zA-Z]/g;
    let test = '1a2b3c4d5A6F7X8Z';
    layer.alert(test.replace(reg, 'M'));
    

    结果:

    1M2M3M4M5M6M7M8M
    

    五、预定义类

    • . 除了回车符和换行符以外的所有字符
    • d 数字字符
    • D 非数字字符
    • s 空白字符
    • S 非空白字符
    • w 单词字符(字母、数字、下划线)
    • W 非单词字符
    • D 非数字字符
    • D 非数字字符
    • D 非数字字符
    • D 非数字字符

    边界匹配字符:

    • ^ 以xxx开始
    • $ 以xxx结尾
    •  单词边界
    • B 非单词边界

    六、量词

    • ? 至多出现一次
    • + 至少出现一次
    • * 出现任意次
    • {n} 出现n次
    • {n,m} 出现n到m次
    • {n,} 至少出现n次
    • {0,m} 最多出现m次

    七、贪婪模式与非贪婪模式

    1.贪婪模式(尽可能多的匹配)

    let reg = /d{3,6}/g;
    let test = '12345678';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    X78
    

    2.非贪婪模式(尽可能少的匹配)

    let reg = /d{3,6}?/g;
    let test = '12345678';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    XX78
    

    八、分组

    1.匹配数字加小写字母连续出现3次的场景

    let reg = /(d[a-z]){3}/g;
    let test = '1a2b3c4d';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    X4d
    

    2.或

    let reg = /1a2b3c(4d|5e)6f7g8h/g;
    let test = '1a2b3c4d6f7g8h 1a2b3c5e6f7g8h';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    X X
    

    3.反向引用(捕获分组中内容)

    let reg = /(d{4})-(d{2})-(d{2})/g;
    let test = '2019-10-30';
    layer.alert(test.replace(reg, '$2/$3/$1'));
    

    结果:

    10/30/2019
    

    注:

    let reg = /(?:d{4})-(d{2})-(d{2})/g; //忽略第一个分组
    

    九、前瞻

    例1.

    let reg = /w(?=d)/g;
    let test = 'a1b2c^d$';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    X1X2c^d$
    

    例2.

    let reg = /w(?!d)/g;
    let test = 'a1b2c^d$';
    layer.alert(test.replace(reg, 'X'));
    

    结果:

    aXbXX^X$
    

    js无后顾!!!

    十、对象属性

    • global : 全局搜索,默认不添加,匹配到第一个停止,默认false
    • ignoreCase : 忽略大小写,默认大小写敏感,默认false
    • multiline : 多行搜索,默认false
    • lastIndex : 当前表达式匹配内容的最后一个字符的下一个位置
    • source : 文本字符串

    例:

    let reg = /w/g;
    layer.alert(reg.global+"</br>"+
                reg.ignoreCase+"</br>"+
                reg.multiline+"</br>"+
                reg.lastIndex+"</br>"+
                reg.source);
    

    结果:

    true
    false
    false
    0
    w
    

    十一、test和exec方法

    1.test方法,找到当前匹配位置的索引(全局调用)

    let reg2 = /w/g;
    let result = '';
    while(reg2.test('abcdef')){
        result += reg2.lastIndex + '</br>';
    }
    layer.alert(result);
    

    结果:

    1
    2
    3
    4
    5
    6
    

    2.exec方法

    如果没有匹配的文本则返回null,否则返回一个结果数组

    • index 声明匹配文本的第一个字符的位置
    • input存放被检索的字符串string

    (1).非全局调用

    • 第一个元素是与正则表达式相匹配的文本
    • 第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话)
    • 第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话)
    • 以此类推...

    例.

    let reg1 = /d(w)d/;
    let ts = '1a2b3c4d5e';
    let ret = reg1.exec(ts);
    let result = '';
    
    result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;
    result += '</br>';
    result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;
    
    layer.alert(result);
    

    结果:

    0 0 1a2,a
    0 0 1a2,a
    

    (2).全局调用

    例.

    let reg2 = /d(w)d/g;
    let ts = '1a2b3c4d5e';
    let ret = '';
    let result = '';
    
    while(ret = reg2.exec(ts)){
        result += reg2.lastIndex + ' ' + ret.index + ' ' + ret;
        result += '</br>';
    }
    layer.alert(result);
    

    结果:

    3 0 1a2,a
    7 4 3c4,c
    

    十二、字符串对象方法

    1.search()方法

    • search()方法用于检测字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
    • 方法返回第一个匹配结果index,查找不到返回-1
    • search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索

    2.match()方法

    • match()方法将检索字符串,以找到一个或多个与regExp匹配的文本
    • regexp是否具有标志g对结果影响很大

    (1).非全局调用

    • 返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
    • 除了常规的数组元素之外,返回的数组还含有2个对象属性
    • index声明匹配文本的起始字符在字符串的位置
    • input声明对stringObject的引用

    例:

    let reg1 = /d(w)d/;
    let ts = '1a2b3c4d5e';
    let ret = ts.match(reg1);
    let result = '';
    
    result += ret + ' ' + ret.index + ' ' + reg1.lastIndex;
    layer.alert(result);
    

    结果:

    1a2,a 0 0
    

    (2).全局调用

    • 如果regexp具有标志g则match()方法将执行全局检索,找到字符串中的所有匹配字符串
    • 没有找到任何匹配的字串,则返回null
    • 如果找到了一个或多个匹配字串,则返回一个数组
    • 数组元素中存放的是字符串中所有的匹配字串,而且也没有index属性或input属性

    例:

    let reg2 = /d(w)d/g;
    let ts = '1a2b3c4d5e';
    let ret = ts.match(reg2);
    let result = '';
    
    result += ret + ' ' + ret.index + ' ' + reg2.lastIndex;
    layer.alert(result);
    

    结果:

    1a2,3c4 undefined 0
    

    3.split()方法

    将字符串分割为字符数组

    例:

    let reg1 = /d/g;
    let ts = '1a2b3c4d5e';
    let ret = ts.split(reg1);
    console.log(ret) //layer不支持数组的弹出,所以改为console
    

    结果:

    ["", "a", "b", "c", "d", "e"]
    

    4.replace()方法

    例1:

    let reg1 = /1/g;
    let ts = '1a1b1c1d1e';
    let result = ts.replace(reg1, 2);
    layer.alert(result);
    

    结果:

    2a2b2c2d2e
    

    replace第二个参数也可以为一个function
    function会在每次匹配替换的时候调用,有四个参数
    (1).匹配字符串
    (2).正则表达式分组内容,没有分组则没有该参数
    (3).匹配项在字符串中的index
    (4).原字符串

    例2:没有分组

    let reg1 = /d/g;
    let ts = '1a2b3c4d5e';
    let ret = ts.replace(reg1, function(match, index, origin){
        console.log(index);
        return parseInt(match)+1;
    });
    console.log(ret);
    

    结果:

    0
    2
    4
    6
    8
    2a3b4c5d6e
    

    例3:有分组(注意参数有变化)

    let reg1 = /(d)(w)(d)/g;
    let ts = '1a2b3c4d5e';
    let ret = ts.replace(reg1, function(match, group1, group2, group3, origin){
        console.log(match);
        return group1 + group3;
    });
    console.log(ret);
    

    结果:

    1a2
    3c4
    12b34d5e
    

    附视频链接:
    https://www.imooc.com/video/12529

  • 相关阅读:
    PHP打开错误提示和关闭错误提示的方法
    squid的简单介绍
    伪静态与重定向--RewriteRule
    PHP操作Redis常用技巧总结
    爱漂泊人生 30个php操作redis常用方法代码例子
    Mysql与Redis的同步实践
    Linux 命令之grep
    Linux 命令之sed
    Linux shell 计算两个文件的并集、交集、差集
    Linux 软链接的创建、删除和更新
  • 原文地址:https://www.cnblogs.com/zqm-sau/p/11766497.html
Copyright © 2020-2023  润新知