• 正则表达式之补获性分组与非补获性分组


    捕获性分组

    javascript中捕获性分组是以小括号()来实现,捕获性分组工作模式()会把每个分组里匹配的值保存起来。

    比如利用捕获性分组把 hello world 互换成 world hello:

    方法一:通过exec函数
    var str = 'hello world';            //首先创建好字符串
    var pattern = /([a-z]+)s([a-z]+)/; //先通过正则匹配这个字符串,用分组模式来获取这两个单词
    var arr = pattern.exec(str); // exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值
    
    console.log(arr); //['hello world','hello','world']  
    console.log(arr[0]); //'hello world' 匹配到的字符串
    console.log(arr[1]); //'hello' 第一个分组([a-z]+)的值
    console.log(arr[2]); //'world' 第二个分组([a-z]+)的值
    
    //这时候两个分组的值都得到了,接下来用字符串拼接法实现互换
    var n_str = arr[2]+' '+arr[1];
    console.log(n_str) //world hello
    方法二:通过属性$1-9
    var str = 'hello world';            
    var pattern = /([a-z]+)s([a-z]+)/; 
    pattern.test(str); //这个地方必须运行正则匹配一次,方式不限,可以是test()、exec()、以及String的正则方式
    
    console.log(RegExp.$1) //'hello' 第一个分组([a-z]+)的值
    console.log(RegExp.$2) //'world' 第二个分组([a-z]+)的值
    
    var n_str = RegExp.$2+' '+RegExp.$1;
    console.log(n_str) //world hello
    方法三:通过String的replace()
    var str = 'hello world'; 
    var pattern = /([a-z]+)s([a-z]+)/; 
    var n_str = str.replace(pattern,"$2 $1"); //这里的$1、$2与方法二里的RegExp.$1、RegExp.$2作用是相同的。
    console.log(n_str) //world hello

    非捕获性分组:(?:

    非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。

    比如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组:

    //先看用捕获性分组匹配会返回什么
    var str1 = '000aaa111';             
    var pattern = /([a-z]+)(d+)/; //捕获性分组匹配
    var arr = pattern.exec(str1);  
    console.log(arr) //['aaa111','aaa','111']   结果子串也获取到了,这并不是我们想要的结果
    
    
    //非捕获性分组
    var str2 = '000aaa111';
    var pattern2 = /(?:[a-z]+)(?:d+)/; //非捕获性分组匹配
    var arr2 = pattern.exec(str2);  
    console.log(arr2) //['aaa111']  结果正确    

    前瞻:(?=)和(?!)

    前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。

    前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。

    正向前瞻匹配一批图片格式:

    //正向前瞻,匹配.jpg后缀文件名
    var str = '123.jpg,456.gif,abc.jpg';
    var partern = /w+(?=.jpg)/g; //正向前瞻匹配
    console.log(str.match(partern)); //['123', 'abc']   返回结果正确,没有匹配456.gif

    反向前瞻匹配一批字母加数字:

    //反向前瞻,匹配3个及以上的a,而且后面不能有000的字符
    var str = 'aaa000 aaaa111 aaaaaaa222';
    var partern = /a{3,}(?!000)/g; //反向前瞻匹配
    console.log(str.match(partern)); //['aaaa', 'aaaaaaa']   返回结果正确,没有匹配aaa000

    前瞻,可以放在位置不固定,可前匹配和后匹配,如:/(?=.jpg)w+/g;

    其他

    正则表达式在线测试:https://regex101.com/r/DAcXTU/2

    参考资料:

    https://www.cnblogs.com/xiuluo--angel/p/7100312.html

  • 相关阅读:
    Java 入门 36 泛型深入 泛型的概述和优势 自定义泛型类 自定义泛型方法 自定义泛型接口 泛型通配符 上下限
    Java 入门34 常见的数据结构
    Java 入门 40 日志框架 项目阶段 (Java 入门 1924天 需要使用在学)
    Java 入门 31 常用API 日期与时间
    Java 入门 32 包装类 正则表达式 Arrays类 Lambda表达式枚举
    Java 入门35 List系列集合, 几黑的并发修改异常问题 LinkedList
    OpenStack yoga安装(Ubuntu)
    OpenStack命令行添加网卡
    Ceph删除pool
    ceph osd 初始化硬盘时提示OSD::mkfs: ObjectStore::mkfs failed with error (5) Input/output error
  • 原文地址:https://www.cnblogs.com/fmyao/p/12578165.html
Copyright © 2020-2023  润新知