zoukankan      html  css  js  c++  java
  • js正则表达式(.+)和(.+?)的区别

    原文链接: https://www.cnblogs.com/yalong/p/14101587.html

    js正则表达式(.+)和(.+?)的区别:

      (.+)默认是贪婪匹配
      (.+?)为惰性匹配

    相关知识介绍:

    1. 匹配任意字符用 . 

    通配符  .  作为任何字符的占位符 (数量为1)
    // To match "cat", "BAT", "fAT", "mat"
    const regexWithWildcard = /.at/gi;
    const testString = "bbcat BAT cupcake fAT mat dog";
    const allMatchingWords = testString.match(regexWithWildcard);
    // ["cat", "BAT", "fAT", "mat"]  

    2. 通配符 . 需要和 * 区分开

    匹配连续出现零次或多次的字符, 使用星号 *,  * 是用来限制出现的次数的
    const zeroOrMoreOsRegex = /hi*/gi;
    const normalHi = "hi";
    const happyHi = "hiiiiii";
    const twoHis = "hiihii";
    const bye = "bye";
     
    normalHi.match(zeroOrMoreOsRegex); // ["hi"]
    happyHi.match(zeroOrMoreOsRegex); // ["hiiiiii"]
    twoHis.match(zeroOrMoreOsRegex); // ["hii", "hii"]
    bye.match(zeroOrMoreOsRegex); // null

    3.匹配一行中出现一次或多次的字符, 使用 +

    const oneOrMoreAsRegex = /a+/gi;
    const oneOrMoreSsRegex = /s+/gi;
    const cityInFlorida = "Tallahassee";
     
    cityInFlorida.match(oneOrMoreAsRegex); // ['a', 'a', 'a'];
    cityInFlorida.match(oneOrMoreSsRegex); // ['ss'];  

    4.惰性匹配

    • 字符串中与给定要求匹配的最小部分
    • 默认情况下,正则表达式是贪婪的(匹配满足给定要求的字符串的最长部分)
    • 使用 ? 阻止贪婪模式 变为惰性匹配
    const testString = "catastrophe";
    const greedyRexex = /c[a-z]*t/gi;
    const lazyRegex = /c[a-z]*?t/gi;
    testString.match(greedyRexex); // ["catast"]
    testString.match(lazyRegex); // ["cat"]
    

    具体分析:

    1.贪婪匹配是先看整个字符串是否匹配,如果不匹配,它会去掉字符串的最后一个字符,并再次尝试,如果还不匹配,那么再去掉当前最后一个,直到发现匹配或不剩任何字符。

    var str='abcdabceba'

    /.+b/     匹配一个或多个任意字符后面跟一个字母b

    执行str.match(/.+b/)  // 匹配到 abcdabceb

    第一次(先看整个字符串是否是一个匹配) abcdabceba 不匹配,然后去掉最后一个字符a

    第二次(去掉最后一个字符后再匹配) abcdabceb 匹配,返回abcdabceb。

    2.惰性匹配是从左侧第一个字符开始向右匹配, 先看第一个字符是不是一个匹配, 如果不匹配就加入下一个字符再尝式匹配, 直到发现匹配

    var str='abcdabceba'

    /.+?b/     匹配一个或多个任意字符后面跟一个字母b

    执行str.match(/.+?b/)    // 匹配到ab

    第一次(读入左侧第一个字符) a 不匹配加一个再式

    第二次 ab 匹配,返回ab

    案例演示

    案例一

    var str = 'aaa<div style="font-color:red;">123456</div>bbb'
    
    // <.+?>会匹配<div style="font-color:red;">
    
    // <.+>会匹配<div style="font-color:red;">123456</div>
    
    console.log(str.match(/<.+?>/)[0])
    
    // 输出为: <div style="font-color:red;">
    
    console.log(str.match(/<.+>/)[0])
    
    // 输出为: <div style="font-color:red;">123456</div>

     案例二

    let str = 'hello {{ text }}-{{err}}look me!'
    
    str.split(/({{.+?}})/g)
    
    //输出为:  ["hello ", "{{ text }}", "-", "{{err}}", "look me!"]
    
    let str2 =  'hello {{ text }}-{{err}}look me!'
    
    str2.split(/({{.+}})/g)
    
    // 输出为: ["hello ", "{{ text }}-{{err}}", "look me!"]
    

      

     

  • 相关阅读:
    P2P之UDP穿透NAT的原理与实现
    Jmeter压力测试工具安装及使用教程
    整合Solr与tomcat以及第一个core的配置
    windows下Redis安装及利用java操作Redis
    spring整合Jersey 无法注入service的问题
    MySQL-Navicat连接MySQL出现1251或1130报错的解决方法
    华为VRP
    开发工具-Sublime
    服务器-Windows 2003 R2-取消多用户登录-多个用户登录显示不同的界面解决方法
    服务器-惠普 HP ProLiant-linux系统-RAID信息查看和阵列卡操作-hpacucli工具使用
  • 原文地址:https://www.cnblogs.com/yalong/p/14101587.html
Copyright © 2011-2022 走看看