例子:假设在fred and barney went bowling last night 上使用/fred.+barney/进行匹配。我们知道正则表达式
将匹配上,下面我们具体的讲解这一个过程:首先,子模式fred 将匹配其对应的字符串。模式的下一部分是.+,它将匹配除了换行符之外的任意字符,次数大于等于一。但,由于加号(+)是贪婪的;它将尽可能的进行匹配。因此,它将匹配剩余的所有字符串,包括night。
现在对banrey 进行匹配,但不能成功,因为已经到了字符串的结尾处。由于.+在少一个字符的情况下仍能匹配成功,因此它退回字符串最后一个字母t。(它虽是贪婪的,但更希望整个模式能匹配成功。)子模式barney 又尝试匹配,结果仍是不行。因此.+再退回字母h,又进行匹配。一个字符接一个字符,.+退回其匹配的字符,直到其退回了字符串barney。最后,子模式banrey 被匹配上了,现在整个模式都匹配上了。
如本例所显示的那样,这些操作引起了大量的回退操作,因为这些数量词匹配了太多的字符串。

因此对于每一个贪婪的数量词,需要一种非贪婪的方法。不是使用加号(+),而是使用非贪婪的数量词+?,它将匹配一次或多次(加号的意思),但其匹配尽可能少的次数,而非尽可能多的次数。现在我们来看看模式为/fred.+?barney/时的过程:
首先,fred 将被匹配上。接着,模式的下一部分是.+?,它匹配的字符个数不大于1,因此匹配fred 后面的空格。下一个子模式是banrey,它在这里不能被匹配(因为现在的位置是and barney… 的开头)。.+?再匹配a,剩下的模式继续进行匹配。又一次,barney 不能匹配上,因此.+?再匹配n,依次类推。当.+?匹配了这5 个字符后,barney 可以被匹配上了,现在模式匹配成功。

这里也存在一些回退操作,但由于引擎只需回退,并只尝试几次,其在速度上会有很大提高。但,这种提高依赖于banrey在fred 的附近能被找到。如果数据中fred 在字符串的开头,而barney 在结尾处,则贪婪数量词方法的速度更快。因此,正则表达式的速度依赖于具体的数据。

非贪婪数量词不仅和效率相关。即便它和其对应的贪婪数量词表达式均能匹配(或者不能匹配)同一个字符串,它们匹配的部分也可能是不同的。例如,假设你有一些HTML 类型的文本,你想移除标记<BOLD>和</BOLD>,而保留其间的内容。下面是文本:
I’am talking about the cartoon with Fred and <BOLD>Wilma</BOLD>!
下面是一种移除标记的方法。它有什么错误呢?
s#<BOLD>(.*)</BOLD>#$1#g;
其问题出在星号是贪婪的。如果文本变成了下面的样子,会得到什么结果?
I thought you said Fred and <BOLD>Velma</BOLD>, not <BOLD>Wilma</BOLD>
此时,模式将匹配从第一个<BOLD>到最后一个</BOLD>之间的内容,中间的部分被保留下来。噢!我们需要非贪婪的数量词。星号的非贪婪的类型是*?,因此此模式应当是:
$#<BOLD>(.*?)</BOLD>#$1#g;
现在它能正确执行了。
由于加号的非贪婪类型是+?,星号的为*?,你可能已经意识到剩下的两种数量词其对应的类型也是类似的。花括号的非贪婪类型看起来一样,只是在闭花括号后有一个问号,如{5,10}?或者{8,}?。甚至问号数量词也有非贪婪类型:??。它匹配一次或者0 次,但倾向于匹配0 次。

转载于:https://www.cnblogs.com/morebetter/archive/2007/05/10/741803.html

perl:非贪婪的数量词相关推荐

  1. Perl——正则表达式之贪婪模式和非贪婪模式

    Perl--正则表达式之贪婪模式和非贪婪模式使用 使用perl进行正则表达式匹配时,常用两种匹配模式,一种是贪婪匹配,一种是非贪婪匹配. 贪婪匹配(greedy match):尽可能匹配最长的内容.默 ...

  2. 如何编写与非贪婪匹配的正则表达式? [重复]

    本文翻译自:How can I write a regex which matches non greedy? [duplicate] This question already has an ans ...

  3. (九) 正则表达式——文本处理(用s///替换、split与join函数、列表上下文中的m//、非贪婪量词、文件更新等)

    文章目录 一.s///替换 1.1.替换的规则要点 1.2.代码示例 二.split与join函数--字符串拆分与组合 三.列表上下文中的m// 四.非贪婪量词--加问号(?) 五.跨行的模式匹配-- ...

  4. VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :...

    VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下: ...

  5. 正则表达式贪婪和非贪婪模式

    *.+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配. 文本: <H1>Chapter 1 - 介绍正则表达式</H1> ...

  6. python 正则表达式贪婪模式与非贪婪模式

    1 贪婪模式与非贪婪模式 的理解 1.1 贪婪模式: 是尽可能的多地匹配字符 ,贪婪模式一般是在元符号后面没有添加? 1.2 非贪婪模式(懒惰模式): 是尽可能的少匹配字符,非贪婪模式一般是元符号后面 ...

  7. python非贪婪、多行匹配正则表达式例子[转载]

    python非贪婪.多行匹配正则表达式例子[转载] 一些regular的tips: 1 非贪婪flag >>> re.findall(r"a(\d+?)", &q ...

  8. java 正则表达式 非贪婪模式_详解正则表达式的贪婪模式与非贪婪模式

    什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配, ...

  9. python基础(十二):正则、re模块、贪婪和非贪婪

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 元字符:在 ...

  10. 正则表达式二 :贪婪与非贪婪

    元字符 . ^ $ * + ? {} [] \ | () 关于正则表达式特殊符号的详细介绍可以点击这个链接:正则表达式特殊符号用法 注意 写正则表达式时不要随意加空格或者换行符以及Tab 贪婪与非贪婪 ...

最新文章

  1. 生产者/消费者模型详解(基于Java)
  2. 西门子smartclient怎么用_西门子官方应用Sm@rtClient Lite APP
  3. CSS布局说——可能是最全的
  4. 《国境的南边》观后感
  5. ubuntu wifi
  6. oracle rman 用户,Oracle RMAN介绍
  7. 详解:Sqoop的介绍
  8. iOS MAC抓包工具charles(青花瓷)配置教程
  9. MySQL的可重复读、幻读及实现原理
  10. 硬盘格式转换:MBR转换到GPT怎么转?
  11. 堪萨斯大学计算机硕士,美国堪萨斯大学计算机工程研究生申请要求
  12. .sh执行文件sed命令出错 bad flag in substitute command: ‘U‘ Mac终端
  13. 自玩树莓派记录-关于树莓派LCD3.5英寸屏幕使用及raspios(raspbian)-lite简单GUI服务搭建记录
  14. html选择本地文件视频并播放器,使HTML5视频播放器播放不同的文件(Make a HTML5 video player play a different file)...
  15. 【SQL】SQL如何使0值升序排序时排最后
  16. iOS 语音搜索通讯录算法
  17. foxmail邮箱怎么导入邮件_Foxmail怎样导入和导出邮箱账户和邮件
  18. 什么是options请求?为什么会有options请求?
  19. 简单聊天室(java版)
  20. 技术漫谈|DOE实验设计系列:关键工艺参数的如何识别、定义?

热门文章

  1. Android 存储学习之SQLite数据库的基本操作
  2. OpenCV之图像二值化
  3. 最长上升子序列(LIS)长度的O(nlogn)算法 (动态规划)
  4. python离线安装tensorflow_TensorFlow 在Linux系统下离线安装
  5. 数论基础——扩展欧几里得算法(模板)
  6. 2.3.3 Zero Sum 和为零(DFS)
  7. Binary Tree Right Side View 二叉树右视图
  8. 【数据结构】可以逃课其它字符串算法的字符串哈希算法
  9. 最大k乘积问题(dp)
  10. 男生是学计算机网络还是应用,男生适合读计算机网络技术专业吗