zoukankan      html  css  js  c++  java
  • 高级正则实例

    如何学好正则,一直是我苦恼的事情,有时候我自己的写的正则,自己也不太明白所以然,抱着试试的态度

    但是我真的很想学好,这里我都会以实例出来,对每一道正则都写上自己的理解(基础部分我就不写,尽量写一些小细节的点)

    部分会参考我看的<<正则指引>>

    多选

    竖线| 分隔多选,但是|的优先级特别低,可以用括号把他包起来

    复杂些|简单写

    专门为捕获组设计的exec

    超级强大,可惜我今天才发现(2019/05/10)

    默认返回的匹配的项,其他匹配的通过是分组的内容,通过[]获取

    let str = "aaabbb";
    /*可以匹配到分组的内容*/
    let reg=/(a+)(?:b+)/g;
    let res = reg.exec(str);
    console.log(res[1]);
    
    let str = "cccddd";
    /*可以匹配到分组的内容*/
    let reg=/(c+)(d+)/g;
    let res = reg.exec(str);
    console.log(res[1]);
    

    比较好的入门资料链接

    replace

    第二个参数是函数
    let url = "https://www.baidu.com?a=1&b=2";
    let reg=/([^&#?+]+)=([^&?#+]+)/g;
    let obj = {};
    //$0  返回整体  $1返回第一个分组  $2 返回第二个分组
    url.replace(reg, ($0,$1, $2) => obj[$1] = $2);
    console.log(obj);
    

    反向引用

    1 到10
    console.log('aaa bbbb ffffff 999999999'.match(/(w)(?=111)(1)+/g));
    
    反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对
    ([a-z])1{2}
    忽略分组  ?:
    正向断言  ?=
    反向断言  ?!
        test  判断return false
    	exec  查看分组
    	search  返回第一个匹配的索引 到不到 -1
    	match  返回数组
    	split
    	replace
    
    //找到重复的单词
    const str = 'This is the theater you you have been to to';
    str.replace(/([a-z]+)s1/ig,(match,...args)=>{
      console.log(args[0]);
    })
    

    环视(多查资料)

    环视,在不同的地方又称之为零宽断言,简称断言。
    ?=P   可定顺序
    ?!P   否定顺序
    ?<=P  肯定逆序
    ?<!P  否定逆序
    
    console.log(/(http|ftp|svn|abc)ddd/g.test('httpddd'));
    

    定锚点

    .*?  如果换行失败 改成 [sS]*?  
    

    正整数+一位小数

    console.log(/^[+]?[1-9]d*(?:.d)?$/.test('+2.1'));
    

    环视

    ?=P 肯定 ?!P 否定

    (?=A)[A-Z]

    (?=A) 所在的位置,后面是A

    [A-Z] 匹配A-Z中任意一个字母

    组合起来

    从左到右正则分别匹配环视(?=A)[A-Z] ,由于环视不消耗正则的匹配字符,因为还能对A进行匹配

     let s1='abcd abcd abbdABCD';
        console.log(s1.match(/(?=a)[a-z]/g)); // ["a","a","a"]
    字母序列后面跟着;
        let s1='aaaa;bbb;cccc;dddd;';
        console.log(s1.match(/[a-z]+(?=;)/g)); //["aaaa", "bbb", "cccc", "dddd"]
    常规匹配   
        let s1 = 'notexefile1.exe';
        console.log(/.+(?=.exe)/g.exec(s1)); //notexefile1
    

    变种用法

    肯定变种
    
    需求包含字母(不区分大小写),数字,6-16为密码
    ^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,16}$
    	讲解
    	使用(?=.*?[a-zA-Z])限定后面的字符中至少有一个字母
        使用(?=.*?[0-9])限定后面的字符中至少有一个数字
        最后通过实际匹配正则[a-zA-Z0-9]{6,16}限定量词
        
    否定变种
    
    获取不是.exe后缀文件不含后缀的文件名 
    正则:(.+)(?!.exe).[^.]+$ 
    
    肯定逆序 (?<=P)
    
    js不支持,但是好像是用webpack的时候是支持的
    需求:获取name参数的值 
    正则:(?<=name=).+
    示例很直白,前面必须是name=,然后获取其后面的数据  
          let s1 = 'name=Zjmainstay';
        console.log(/(?<=name=).+/g.exec(s1));// Zjmainstay
    

    正则分块组合法-必须包含字母、数字、特殊字符

    正则:^(?=.*?[a-z])(?=.*?d)(?![a-zd]+$).+$

    解析:  (?=.*?[a-z])限制必须有字母

    (?=.*?d)限制必须有数字

    (?![a-zd]+$)限制从开头到结尾不能全为数字和字母

    .+在没有限定的情况下可以是任意字符  ^$ 限定字符串的开头和结尾

    正则逐步完善法-排除特定标签p/a/img,匹配html标签

    正则:</?(?!p|a|img)([^> /]+)[^>]*/?>

    从简单标签入手,对于</p><br />,写出正则:  </?[^>]*/?>

    我们观察可得,标签名是这样得到的:

    无属性值:<p>           <([^>]+)
    有属性值:<p class      <([^ ]+)
    无属性值自闭合:<br/>   <([^/]+)
    闭合标签:</p>          </([^>]+)>
    

    得到正则:

    </?([^> /]+)
    

    最后,我们需要排除p/a/img标签,用否定顺序法,在标签名前面加入否定环视:  </?(?!p|a|img)([^> /]+)[^>]*/?>

    正则减除查错法-匹配异常原因查找

    <ul>
        <li class="item">item1</li>
        <li class="item">item2</li>
        <li class="item bug">item3</li>
        <li class="item">item4</li>
        <li class="item">item5</li>
    </ul>
    

    正则:<li class="item">(.*?)</li>

    问题"item bug" 怎么解决

    正则<li class="item[^"]*"

    最终的正则<li class="item[^"]*">(.*?)</li>

    正则练习题

    https://www.zybuluo.com/Zjmainstay/note/709093
    

    匹配个数为偶数且不能为空

    /^(..)+$/
    

    正则查找不包含某些字符串

    ^((?!不想包含的字符串).)*$
    
    解释
    (?!不想包含的字符串)   //是匹配位置
    .是任意字符
    表达式(?!hede).只执行一次
    匹配0次或多次:((?!hede).)*
    

    需求:匹配每行数据中以.jpg/.jpeg/.png/.gif结尾的图片名称(含后缀)

    .+(?=.(jpg|jpeg|png|gig)).+
    

    ###################################################......................................................................................................................................................................................................................................................................................................................................................................................................................

  • 相关阅读:
    Jquery ajax的访问 WebService 的方法传参ASMX实例总结
    sql的行转列(PIVOT)与列转行(UNPIVOT) sqlserver
    JS获取url参数。分开获取根据值KEY,快速简单
    梦幻西游手游帮派技能费用表60-70-80-90-100级
    html.div禁用点击事件.JQ.JS设置DIV及包含里面控件不能点击
    js判断是否是ie浏览器且给出ie版本,IE67891011
    @media 兼容ie8-CSS3响应式布局(@media screen)兼容IE6-8的方法 (IE9以下)
    读取,设置指定目录下的配置文件的节点key value。config或XML
    input type="number" 禁止输入字母E,只能输入数字和小数点
    .net NPOI导出EXCEL多个sheet
  • 原文地址:https://www.cnblogs.com/fangdongdemao/p/10964189.html
Copyright © 2011-2022 走看看