以前看正则表达式,但没有注意到正则表达式的贪婪与非贪婪模式,今天在经典上看到了这么段代码:

<script>
try{
str="

abcdefg

abcdefghijkl

";

re1=str.match(/<p>[/W/w]+?<//p>/ig);
alert("非贪婪模式:/r/n/r/n1:"+re1[0]+"/r/n2:"+re1[1]);

re1=str.match(/<p>[/W/w]+<//p>/ig);
alert("贪婪模式:/r/n/r/n"+re1);

re1=str.match(/<p>(.+?)<//p>/i);
alert("非贪婪模式,且不要标记:/r/n/r/n1:"+re1[1]);

re1=str.match(/<p>(.+)<//p>/i);
alert("贪婪模式,且不要标记:/r/n/r/n"+re1[1]);
}catch(e){alert(e.description)}
script>


 匹配次数中的贪婪与非贪婪

在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

表达式

匹配结果

(d)(/w+)

"/w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(/w+)(d)

"/w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "/w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"/w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

由此可见,"/w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

非贪婪模式:

在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式

匹配结果

(d)(/w+?)

"/w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"/w+?" 只匹配了一个 "x"

(d)(/w+?)(d)

为了让整个表达式匹配成功,"/w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"/w+?" 匹配 "xxx"

更多的情况,举例如下:

举例1:表达式 "(.*)" 与字符串 "

aa

bb

" 匹配时,匹配的结果是:成功;匹配到的内容是 "

aa

bb

" 整个字符串, 表达式中的 "" 将与字符串中最后一个 "" 匹配。

举例2:相比之下,表达式 "(.*?)" 匹配举例1中同样的字符串时,将只得到 "

aa

", 再次匹配下一个时,可以得到第二个 "

bb

"。

关于正则表达式的贪婪与非贪婪模式 - A JavaScript Fancier - IT博客网相关推荐

  1. 正则表达式贪婪与非贪婪模式

    正则表达式贪婪与非贪婪模式 之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:Stri ...

  2. 正则表达式之 贪婪与非贪婪模式详解

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...

  3. 转:正则表达式之 贪婪与非贪婪模式详解

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...

  4. 94. 正则表达式贪婪与非贪婪模式的区别?

    正则表达式,爬虫地时候用的比较多吧,暂时还没有接触过写爬虫地代码,先放下 写好正则表达式也是个不容易的事啊 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc& ...

  5. java正则表达式非贪婪_正则表达式贪婪与非贪婪模式(示例代码)

    之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...

  6. 正则表达式(四)——贪婪与非贪婪模式

    高级用法在这里:正则表达式(三)--高级用法:search,findall,sub,split 8.贪婪与非贪婪模式 首先我们以简单的例子来说说什么是正则表达式的贪婪与非贪婪匹配? 比如假定匹配字符串 ...

  7. 正则表达式的贪婪和非贪婪模式

    最近在写程序时,碰到一个场景,需要找到一个字符串中指定的一个片段,而不是所有片段,这就涉及到正则表达式中贪婪和非贪婪两种模式. 字面意思上,正则表达式一般趋向于最大长度匹配,就是贪婪模式.匹配到结果就 ...

  8. 正则表达式口诀及常用正则 。正则贪婪与非贪婪模式

    正则表达式口诀及常用正则 签于网上太多的介绍都是一篇凶悍的短文,边看边理解可以,帮助记忆不行.又受五笔字型字根表口诀"白手看头三二斤..."的启发,  试作"正则表达式助 ...

  9. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式

    1.首先看看下面的例子: try{ str=" abcdefg abcdefghijkl "; re1=str.match(/ [\W\w]+?/ig); alert(" ...

最新文章

  1. webstorm同时打开多个project方法
  2. 1、RabbitMQ入门
  3. 织梦dedecms实现按照字母搜索的实现方法
  4. oracle 长事务 逻辑日志,goldengate中长事务引起的问题
  5. [C++STL]常用拷贝和替换算法
  6. Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体
  7. 莆田学院计算机科学与技术分数,莆田学院录取分数线2021是多少分(附历年录取分数线)...
  8. win7重装系统时,使用PE工具箱进入系统看到的“C盘变成0.2G,D盘变成48G左右”这是什么回事?...
  9. linux 双网卡 双交换机,linux双网卡bond及交换机配置
  10. BUAAOO P5-P7 Elevator Simulation
  11. 用户输入的数是否为合数php,php怎么判断一个数是不是素数?
  12. ssh整合之三(实现逻辑)
  13. php中连接网页头尾部,网页共用头部和尾部的部分方法
  14. linux下架子网卡,Linux下新手装网卡指南
  15. jeb 导出java_[原创] JEB2插件,导出APK资源文件
  16. Froala 编辑器设置表格页脚
  17. BP神经网络算法基本原理,bp神经网络算法详解
  18. oracle 经纬度格式转换,GOOGLE与百度经纬度互转(plsql版)
  19. 点歌机显示歌库服务器未能连接,快速解决常见的六种KTV点歌设备突发故障
  20. 香农编码、费诺编码、哈弗曼编码

热门文章

  1. 理解分析问题的常用方法
  2. DOS批处理脚本语言简介与详细说明
  3. Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势
  4. 制作Windows U盘启动盘---微软官方提供(最容易上手的方式)
  5. 央行首次回应“房贷松绑”:耐心等待文件 新乡房产网
  6. 克隆虚拟机,网络配置
  7. Ubuntu20.04 防火墙设置(简易教程)
  8. java计算机数字逻辑在线学习系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  9. awstats 配置
  10. java程序员面试交流项目经验