zoukankan      html  css  js  c++  java
  • 正则表达式之补获性分组与非补获性分组

    捕获性分组

    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

  • 相关阅读:
    linux 文件记录锁详解
    Linux fcntl函数详解
    大数相加
    信雅达面试题atoi函数实现
    linux getopt函数详解
    strcpy和memcpy的区别
    手把手写数据结构之栈操作
    手把手写数据结构之队列操作
    手把手写数据结构之双向链表操作
    ORACLE查询内存溢出
  • 原文地址:https://www.cnblogs.com/fmyao/p/12578165.html
Copyright © 2011-2022 走看看