正则表达式 贪婪模式 懒惰模式

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

代码/语法 说明

*? 重复任意次,但尽可能少重复

+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复

{n,m}? 重复n到m次,但尽可能少重复

{n,}? 重复n次以上,但尽可能少重复

时间: 2024-10-13 02:56:06

正则表达式 贪婪模式 懒惰模式的相关文章

正则表达式的三种模式【贪婪、勉强、侵占】的分析

假定要分析的字符串是xfooxxxxxxfoo 模式.*foo (贪婪模式): 模式分为子模式p1(.*)和子模式p2(foo)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型). 匹配开始时,吃入所有字符xfooxxxxxx去匹配子模式p1.匹配成功,但这样以来就没有了字符串去匹配子模式p2.本轮匹配失败:第二轮:减少p1部分的匹配量,吐出最后一个字符, 把字符串分割成xfooxxxxxxfo和o两个子字符串s1和s2. s1匹配p1, 但s2不匹配p2.本轮匹配失败:第三轮,再次减少

python 正则表达式 贪婪模式的简介和匹配时的几种模式

看到一篇文章,关于python正则的,http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 贪婪模式与非贪婪模式: 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪的则相反,总是尝试匹配尽可能少的字符.例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb".而如果使用

【转】正则表达式贪婪与非贪婪模式

转自:http://www.cnblogs.com/xudong-bupt/p/3586889.html 正则表达式贪婪与非贪婪模式 之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串st

从正则表达式的iUs说说模式修正符

本想做个简单的采集程序,发现被抓页面代码的规律后发现抓下来的内容没有放到一个数组中,而是放在一个元素中,无奈找遍资料发现在正则表达式后加上"/iUs"后竟然可以了. 网上关于iUs的说明多数都是抄袭的,没有做过多的解释,对于一个小学毕业证是买来的人来说是在是不好理解.不过幸亏Google让我找到答案. "iUs" 在这里叫"模式修正符".模式修正符其实就是几个字母,可以一次使用一个也可以一次使用多个,每一个都具有一定的意义,模式修正符是对正则表达

Linux TLB 刷新的懒惰模式

我们都知道,在切换页表时会刷新 TLB,这样就可以使用新的地址空间,那什么是 TLB 刷新的懒惰模式呢? TLB 是什么这里不作多的解释,可以简单理解为,为了加快 MMU 对虚拟地址的转换而增加的缓存,它记录了一个虚拟地址对应的内存页的物理地址.其实就是根据虚拟地址的前 20 位,来建立一个个条目,对应记录通过查找页表来记录的内存页的物理地址. 既然有缓存,那么被缓存的内容改变时,就涉及到缓存的刷新,就是 TLB 的刷新问题,当一个页表结构发生变化时,使用该页表节构的 CPU 就应该刷新自己的

正则表达式中常用的模式修正符有i、g、m、s、x、e详解

正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或aBC或ABc等匹配; //修正符:g表示全局匹配 //修正符:m 将字符串视为多行,不管是那行都能匹配; 例://模式为:$mode="/abc/m"; //要匹配的字符串为:$str="bcefg5e\nabcdfe" //注意其中\n,换行了;abc换到了下一行;

正则表达式的全局匹配模式

首先,要明确一点,所有的正则表达式都有一个lastIndex属性,用于记录上一次匹配结束的位置.如果不是全局匹配模式,那lastIndex的值始终为0,在匹配过一次后,将会停止匹配. 正则表达式的全局匹配模式,就是在创建正则表达式的时候使用g标识符或者将global属性设置为true,在全局匹配模式下,正则表达式会对指定要查找的字符串执行多次匹配.每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开始查找的起始位置.如果找不到匹配的项lastIndex的值会被重新设置为0.

正则学习笔记——重复、贪婪与懒惰

1.贪婪与懒惰 贪婪与懒惰的适用情况是针对重复的情况: 重复的限定符: * 重复>=0次 + 重复>=1次 ? 重复0或1次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n-m次 重复匹配默认贪婪: 实例中a.*b将匹配最长的以a开始,以b结束的字符串. 要想实现重复匹配开启懒惰模式,通过在重复限定符后添加?,效果是p匹配成功的前提是使用最少的重复

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage