• (二)正则表达式——捕获


    (二)正则表达式——捕获

    正则捕获的懒惰性

    实现正则捕获的方法:exec

    exec返回的结果:

    懒惰性

    这就是正则捕获的懒惰性:默认只捕获第1个

    lastIndex:下次匹配的开始位置

    懒惰的原因:默认lastIndex的值不会改变,所以每次找都是从开始位置开始找,所以都只找到第1个。

    解决正则的懒惰性:用全局g模式

    手写execAll

    1. let str=`baidu2019ali2020zhufeng2021peixun2022`
    2. let reg=/(\d+)/g
    3. reg.lastIndex=11;
    4. console.log(reg.exec(str));
    5. (function(){
    6. RegExp.prototype.execAll=function(str){
    7. let arr=[],res=this.exec(str);
    8. if(!this.global) return res;
    9. while(res){
    10. arr.push(res[0]);
    11. res=this.exec(str);
    12. }
    13. return arr.length?arr:null;
    14. }
    15. const reg=/\d+/g;
    16. const str=`baidu2019ali2020zhufeng2021peixun2022`
    17. console.log(reg.execAll(str));
    18. })()

    分组捕获和分组引用

    非g模式

    分组引用

    \1:出现跟分组1一模一样的内容

    取消贪婪性

    当?出现在量词元字符后面,表示的是取消贪婪

    1. let str=`look`
    2. let reg=/([a-z])\1+/i
    3. console.log(reg.exec(str));
    4. str=`2019-12-23`
    5. reg=/\d+?/g
    6. console.log(reg.exec(str));

    当出现在其他元字符后面,表示的是0-1次

    ?的五大作用

    分组的3大作用:

    1. 改变优先级
    2. 捕获到匹配的内容
    3. 分组引用

    其他能捕获到的方法

    reg.test略

    使用test方法,则需要用RegExp.$1 拿到捕获到的信息。

    最多支持$1-$9

    replace*

    年月日

    1. let str='2019-11-23'
    2. let reg=/(?<=\d{4})-/
    3. str=str.replace(reg,'年');
    4. console.log(str);
    5. str='2019-11-23'
    6. reg=/^(\d{4})-(\d{2})-(\d{2})$/
    7. // str=str.replace(reg,function(_,$1,$2,$3){
    8. // return `${$1}年${2}月${3}日`
    9. // })
    10. str=str.replace(reg,'$1年$2月$3日')
    11. str=str.replace(reg,`$1年$2月$3日`)
    12. console.log(str);

    replace中通过$1 $2 直接拿到分组信息

    单词首字母大写

    1. let str=`Cybersecurity firm's word-spell 'abc' Symantec says Dragonfly group has been`
    2. let reg=/\b[a-z]+\b/gi
    3. str=str.replace(reg,function(word){
    4. return word[0].toUpperCase()+word.slice(1)
    5. })
    6. console.log(str);

    最多出现的字母

    对象法(去重思路)

    排序+正则法*

    1. 先排序
    2. 和前面一样:分组引用

    !!!用正则很巧妙

    1. str.match

    用正则:

    当你不需要分组信息的时候,用str.match更方便

    但是需要分组信息的时候,str.match则无法满足,需要循环reg.exec(replace等)

    1. let str=`aghijijfeiswwwwaacvfefefeefeass`;
    2. str=str.split('').sort((a,b)=>a.localeCompare(b)).join('')
    3. console.log(str);
    4. let reg=/([a-z])\1+/g
    5. let arr=str.match(reg);
    6. console.log(arr);
    7. arr.sort((a,b)=>b.length-a.length);
    8. console.log(arr);
    9. let max=arr[0].length;
    10. arr=arr.filter(str=>str.length===max);
    11. console.log(arr);
    12. arr=arr.map(i=>i[0])
    13. console.log(`最多次数的字符是${arr.join('|')} 最多次数为${max}`)

    次数+正则法*

    1. let str=`aghijijfeiswwwwaacvfefefeefeass`;
    2. str=str.split('').sort((a,b)=>a.localeCompare(b)).join('')
    3. console.log(str);
    4. let count=str.length,arr=[];
    5. for(;count>0;count--){
    6. const reg=new RegExp(`([a-z])\\1{${count-1}}`,'g')
    7. arr=str.match(reg);
    8. if(arr){
    9. arr=arr.map(i=>i[0])
    10. break;
    11. }
    12. }
    13. console.log(`最多次数的字符是${arr.join('|')} 最多次数为${count}`)

    其他做法

    时间字符格式化

    1. (function(){
    2. function format(template=`{0}年{1}月{2}日 {3}时{4}分{5}秒`){
    3. let date=this.match(/\d+/g);
    4. template=template.replace(/\{(\d+)\}/g,function(_,$1){
    5. const time=date[$1]
    6. time.length<2?`0${time}`:null;
    7. return time;
    8. })
    9. return template;
    10. }
    11. String.prototype.format=format;
    12. let str=`2019-7-21 18:25:39`
    13. str=str.format()
    14. console.log(str)
    15. })()

    queryURLParams

    答案做得很简单

    千分符*

    正则解法:

    正向预查:条件符合

    负向预查:只要条件不符合

    1. // 3位一个逗号
    2. let num=567825612345;
    3. let str=num+'';
    4. console.log(str);
    5. let reg=/\d(?=(\d{3})+(?!\d))/g
    6. reg=/\d(?=(\d{3})+$)/g
    7. str=str.replace(reg,(num)=>num+',')
    8. console.log(str);

    这里也有一段 断言 的正则

    https://cdn.jsdelivr.net/gh/bobcn/hexo_resize_image.js@master/hexo_resize_image.js

  • 相关阅读:
    069:vue+openlayers 显示闪闪发光的点划线( 示例代码 )
    Gradle 中 api、implementation、compileOnly、provide 区别与联系
    听GPT 讲Rust源代码--library/std(7)
    java中的阻塞队列和copyOnWriteArrayList
    c++怎么传递函数
    SpringBoot 3.x 结合 Swagger3 (Knife4j )踩坑实录
    金仓数据库 KingbaseES SQL 语言参考手册 (14. SQL语句:COMMIT 到 CREATE LANGUAGE)
    redux-thunk 简单案例,优缺点和思考
    write_project_tcl
    C++错误处理漫谈
  • 原文地址:https://blog.csdn.net/betterangela/article/details/128135643