greedy、reluctant和possessive量词的区别

greedy、reluctant和possessive量词之间有微妙的区别。

greedy量词被看作“贪婪的”,因为它们在试图搜索第一个匹配之前读完(或者说吃掉)整个输入字符串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在输入字符串中后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1个或者0个字符。

但是,reluctant量词采取相反的方式:它们从输入字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。

最后,possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和greedy量词不同,possessive从不后退,即使这样做能允许整体匹配成功。

为了演示,我们分析输入字符串xfooxxxxxxfoo:

Enter your regex: .*foo  // greedy quantifier

Enter input string to search: xfooxxxxxxfoo

I found the text "xfooxxxxxxfoo" starting at index 0 and ending atindex 13.

Enter your regex: .*?foo  // reluctant quantifier (常用于 Matcherfind 匹配)

Enter input string to search: xfooxxxxxxfoo

I found the text "xfoo" starting at index 0 and ending at index4.

I found the text "xxxxxxfoo" starting at index 4 and ending atindex 13.

Enter your regex: .*+foo // possessive quantifier

Enter input string to search: xfooxxxxxxfoo

No match found.

第一个例子使用greedy量词.*搜索“任何内容”零次或者多次,后面是字母f、o、o。因为是greedy量词,所以表达式的.*部分首先读完整个字符串。这样,整个表达式不会成功,因为最后三个字母(“f”“o”“o”)已经被消耗了。所以匹配器缓慢地一次后退一个字母,一直后退到最右侧出现“foo”为止,这里匹配成功并且搜索停止。

但是第二个例子使用的量词是reluctant量词,所以它首先消耗“无内容”。因为“foo”没有出现在字符串的开头,所以迫使它消耗掉第一个字母(x),这样就在索引0和4的位置触发第一个匹配。我们的测试示例继续处理,直到输入字符串耗尽为止。它在索引4和13找到了另一个匹配。

第三个例子找不到匹配,因为是possessive量词。这种情况下,.*+消耗整个输入字符串,在表达式的结尾没有剩下满足“foo”的内容。possessive量词用于处理所有内容,但是从不后退的情况;在没有立即发现匹配的情况下,它的性能优于功能相同的greedy量词。

greedy、reluctant和possessive量词相关推荐

  1. 分享给你——2017我学到的方法论

    1.啦啦啦--初衷 可能是因为之前在QQ空间发的说说都偏向正能量,用词都是一些比较励志型的言语,所以同学们经常说: "戴老板优秀"(奉承而已,我明白,嗯) "戴老板心灵鸡 ...

  2. 即使你毕业非名校,也能找到月入10k的工作

    下午在家逛简书,突然看到一篇关于怎样在工作面试时回答HR问到不是211,985的情形文章.作者写的很好,文章深入的分析了HR这样提问的背后含义,给了读者如何作答的建议,很幸运能看到这样的经验好文.于是 ...

  3. java 正则 关键字_正则表达式关键字

    在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总 字符 说明 ^ 匹配输入字符串的开始位置.要匹配 "^" 字符本身,请使用 "\ ...

  4. 快速掌握正则表达式,掌握常用的就ok

    正则表达式常用字符 . 表示匹配任意一个字符 X* 表示字符X出现了0次或者多次 X+ 表示字符X出现了1次或者多次 X? 表示字符X出现0次或者1次 [abc]表示匹配字符a,b,c中的任意一个,[ ...

  5. Java - 正则表达式的运用(Pattern模式和Matcher匹配)

    一.绪论: 在写程序的过程中,有时会需要匹配.查找.替换或者是判断字符串的出现情况,而且有时不能用简单的纯编码方式解决这些问题,这个时候就会想到要正则表达式,无论是Java, PHH, C#,  Py ...

  6. java 正则 实例_Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  7. 《精通正则表达式》笔记 --- 选择引号内的文字

    这个例子出自<精通正则表达式>,做一下笔记帮助理解和记忆. 第一版 最简单的case就是考虑包含一对引号,那么写出来的表达式应该是这样的: ".*" 但是这个未免太简单 ...

  8. java正则表达式中的数量词介绍及区别

    Java的正则表达式相关的类位于 java.util.regex 包中; 这个包中只有一个 MatchResult 接口和 Matcher.Pattern 两个类; 有关正则表达式的使用请参考Java ...

  9. 正则表达式:pattern=[^\\w]---------总结------------

    正则表达式是一种处理字符串的工具,它提供了一种精炼的动态语言,使我们能用一种通用的方式来解决各种字符串问题,包括:匹配.选择.编辑以及校验. pattern="[^\\w]"--- ...

最新文章

  1. 利用blktrace分析磁盘I/O
  2. 金融行业安全漏洞分析报告
  3. CSS3秘笈第三版涵盖HTML5学习笔记6~8章
  4. 寒假每日一题2022【week2 未完结】
  5. php生成zip文件,使用PHP处理zip压缩文件之ZipArchive
  6. 《江南百景图》游戏设计小思考:留边占角“小烦恼”
  7. 业界资讯:adobe 技术开发中心 放出游戏单元
  8. 在B站学习大名鼎鼎的StatQuest 系列统计和生信分析视频(中文字幕)- 也见证助理教授到创业者的华丽转身...
  9. 机器学习模型_如何口述机器学习模型原理
  10. 【牛客网】——字符串的旋转
  11. pymysql安装_centos7.6 安装openstack stein组件之四
  12. 【2021牛客暑期多校训练营9】E Eyjafjalla (倍增,dfs序,主席树)
  13. Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)
  14. 文件夹html文件批量替换,DirRplacer(文件批量替换工具)
  15. 射频电路设计——传输线理论
  16. 中国工程院院士张尧学:透明计算/云计算操作系统
  17. 解决 Kotlin 换页符提示错误 Illegal escape f 无法使用问题
  18. 17AHU排位赛2 A题(最小生成树、LCA维护树上路径)
  19. 快手,抖音,美拍打造个人IP精准引流!
  20. linux用户motd,linux – 每个用户的SSH MOTD

热门文章

  1. 活猫还是死猫?| 薛定谔的猫 | 儿童故事
  2. 考研英语(五)——定语从句
  3. 安装 Ruby On Rails on Windows
  4. python调用打印机打印图片_Python使用Python将图像位数据打印到ESC/POS打印机
  5. Flink系列文档-(YY08)-Flink核心概念
  6. 内存的寻址、传输、存取时间与延迟原理介绍
  7. keypress,keydown,keyup的区别:
  8. android中转换content://media/external/images/media/539163为/storage/emulated/0/DCIM/Camera/IMG_20160807_
  9. 杰理AC692X---AD按键介绍
  10. bindService不调用onServiceConnected的问题