正则表达式(regex) 贪婪模式、懒惰模式使用方法

正则表达式贪婪匹配模式,对于初学者,往往也很容易出错。有时候需要匹配一个段代码内容,发现匹配与想要不一致。发现原来,跟贪婪模式有关系。如下,我们看下例子:

什么是贪婪模式
字符串有: “<h3>abd</h3><h3>bcd</h3>”,我们想匹配<h3>…</h3>内容,正则表达式如下:

1、h3开头与结尾,”<h3>待添加</h3>” <h3></h3>都作为普通字符

2、中间可以出现任意字符,个数可以是0个或者多个,正则表达式可以用:.* ,“.”代表任意字符,默认模式不匹配换行,”*” 重复前面字符0个或者多个。

3、最终我们考虑结果将是:”<h3>.*</h3>” ,也可以是:”<h3>.{0,}</h3>” {}代表,重复前面指定个数字符,以下用到是,正则表达式调试工具截图,软件可以看:正则表达式工具推荐(学习工具、测试工具)

2种结果都一样,这是我们不希望得到的,我们希望从左边开始,第一个出现</h3>,就开始匹配。以上这种模式,是贪婪模式,也是正则表达式默认以这个方法匹配。表示重复字符,操作符,默认都是贪婪模式,如:.*,.+,.{1,},.{0,} 都会匹配最大长度字符。正则表达式元字符,量词默认首先最大匹配字符串,这些量词有:+,*,?,{m,n} 。一开始匹配,就直接匹配到最长字符串。

什么是懒惰模式
既然上面几种,表示字符重复个数,元字符默认都是贪婪模式。如果,我们需要最小长度匹配,也就是懒惰模式,怎么样写正则表达式呢?其实,正则表达式里面通用方法是,在表示重复字符元字符,后面加多一个”?”字符即可。上面正则表达式可以写成:”<h3>.*?</h3>”,或者”<h3>.{0,}?</h3>” 都可以。

懒惰模式,就匹配到我们需要字符串了。

总结:正则表达式,表示字符串重复个数元字符,'?,+,*,{}' 默认都会选择贪婪模式,会最大长度匹配字符串,而要切换到懒惰模式,就只是在该元字符,后面加多一个”?” 即可切换到非贪婪模式(懒惰模式)。

(0)

相关推荐

  • 小议正则表达式效率 贪婪、非贪婪与回溯

    先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. 复制代码 代码如下: $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 看起来,好像没什么问题,其实则不然.若 复制代码 代码如下: $str = '<script<script>alert(docume

  • php正则表达式中的非贪婪模式匹配

    一般情况下,正则表达式的匹配是贪婪模式的,比如下面这个例子: 字符串:....src="http://www.bloghome.cn/1.mp3" type="application/x-mplayer2" .... 要求的结果:http://www.bloghome.cn/1.mp3 如果匹配表达式写为:/src="(.*)"/,则得不到正确的结果,因为最后一个双引号的匹配是贪婪模式的. 解决办法:匹配表达式写为: /src="(.*

  • php正则表达式中贪婪与非贪婪介绍

    一.贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一. 我们来看看正则里面是怎么贪婪的 <?php $str = '<td>面包一</td><td>面包二</td>'; preg_ma

  • 正则表达式之 贪婪与非贪婪模式详解(概述)

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: "{m,n}"."{m,}"."?"."*"和"+". 在一些使用NFA引擎的语言中,在匹配优先量词后加上"?",即变成属于非

  • Java正则之贪婪匹配、惰性匹配

    贪婪量词: 先看整个字符串是不是一个匹配.如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试.如果还是没有发现匹配,那么    再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符.简单量词都是贪婪量词. 惰性量词: 先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串.如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配.惰性量词和贪婪量词的工作方式恰好相反

  • 浅谈php正则表达式中的非贪婪模式匹配的使用

    通常我们会这么写: 复制代码 代码如下: $str = "http://www.baidu/.com?url=www.sina.com/"; preg_match("/http:(.*)com/", $str, $matches); print_r($matches); 结果: 复制代码 代码如下: Array ( [0] => http://www.baidu/.com?url=www.sina.com [1] => //www.baidu/.com?

  • [正则表达式]贪婪模式与非贪婪模式

    复制代码 代码如下: /**     **   author: site120     **   function : get script part from html document     **/     var loadJs = function(str , delayTime)      {          var delayTime = delayTime || 100;          var regExp_scriptTag = new RegExp("<\\s*sc

  • 正则表达式(regex) 贪婪模式、懒惰模式使用方法

    正则表达式贪婪匹配模式,对于初学者,往往也很容易出错.有时候需要匹配一个段代码内容,发现匹配与想要不一致.发现原来,跟贪婪模式有关系.如下,我们看下例子: 什么是贪婪模式 字符串有: "<h3>abd</h3><h3>bcd</h3>",我们想匹配<h3>-</h3>内容,正则表达式如下: 1.h3开头与结尾,"<h3>待添加</h3>" <h3></h

  • C#中正则表达式(Regex)过滤内容的基本使用方法

    目录 命名空间 简单了解后开始教程 1.读取文本内容 2.创建正则表达式 3.输出匹配好的内容 补充:C#正则表达式筛选去掉不符合的字符 总结 先看英文意思 命名空间 using System.Text.RegularExpressions; 正则表达式是干什么用的? 简单来说就是 检索 数据 个人比较喜欢用来过滤一些文本的内容和网页 比如我有100w个文字想找到里面的几个数字用人工一个一个查找基本不可能 但是使用正则表达式就可以在马上找到 在编程里还是比较重要的 简单了解后开始教程 比如有一个

  • 正则表达式单行、多行模式简介(使用说明)

    继上几篇正则表达式相关说明(详情:正则表达式 ),我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方.单行,多行模式,都是正则表达式的模式修饰符里面出现的参数.目前常用正则表达式都有该使用选项,如:javascript 正则表达式,一般是:"/正则表达式匹配字符/修饰符" ,最后一个"/" 后面是修饰符.然后,php也是类似的,c#,python等,一般调用正则表达式的匹配函数,都有一个另外选项的,设置模式. 单行.多行模式容易出现理解错误 为什么说,容

  • 详解正则表达式的贪婪模式与非贪婪模式

    什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c). 非贪婪匹配:就是匹配到结果就好,就少的匹配字符.如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c). 下面通过实例代码看下正则表达式的贪婪模式与非贪婪模式,具体内容如下所示: 贪婪模式:能匹配

  • JS中正则表达式只有3种匹配模式(没有单行模式)详解

    JS正则表达式对象模式仅有如下三种:  g (全文查找出现的所有 pattern) i (忽略大小写) m (多行查找) 即没有单行匹配模式,Singleline(单行模式):更改.的含义,使它与每一个字符匹配(包括换行符\n). 如java中 String regex = "(?s)(?<=interface).{0,500}(shutdown)";---------"."表示在一行. 但可以采用[\d\D]或[\w\W]或[\s\S]或(.|\s)*?来解

  • Android 实现夜间模式的快速简单方法实例详解

    ChangeMode 项目地址:ChangeMode Implementation of night mode for Android. 用最简单的方式实现夜间模式,支持ListView.RecyclerView. Preview Usage xml android:background="?attr/zzbackground" app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称 比如 R.attr.zzb

  • Joomla实现组件中弹出一个模式(modal)窗口的方法

    本文实例讲述了Joomla实现组件中弹出一个模式(modal)窗口的方法.分享给大家供大家参考,具体如下: 最关键的JS在 /media/system/js/modal.js .有以下两种方式都可以实现,修改的都是扩展组件的模板文件default.php. 方式一: <?php JHTML::_('behavior.modal', 'a.modal');?> <a rel="{handler: 'iframe', size: {x: 570, y: 400}}" hr

  • C#实现单件模式的三种常用方法

    本文实例讲述了C#实现单件模式的三种常用方法.分享给大家供大家参考.具体分析如下: 单件模式是一种设计模式,即保持同时只能创建一个实例,下面列出了C#实现单件模式的三种方法 方法1 public sealed Class Singleton { private static ReadOnly Singleton instance = new Singleton(); private Singleton(){} public static Singleton Instance { get { re

  • Python读写文件模式和文件对象方法实例详解

    本文实例讲述了Python读写文件模式和文件对象方法.分享给大家供大家参考,具体如下: 一. 读写文件模式 利用open() 读写文件时,将会返回一个 file 对象,其基本语法格式如:  open ( filename, mode) 其中,filename变量是一个包含了你要访问的文件名称的字符串值.而mode决定了你打开文件的模式:只读,写入,追加等.所有可取值见如下的完全列表. 注:这个参数是非强制的,默认文件访问模式为只读模式(r) 例如,我们现在将一个字符串写入到test.txt文件中

随机推荐