Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】

news/2024/5/18 22:29:19
在Sun的API中对在对  “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive” 的描述,不能让我明白他们有什么区别,现在将我对这三种匹配模式的理解写出来,供大家参考。


1、Greediness( 贪婪型 ): 最大匹配

X?、X*、X+、X{n,}都是 最大匹配 。例如你要用“<.+>”去匹配“a<tr>aava</tr>abb”,也许你所期待的结果是想匹配“<tr>”,但是实际结果却会匹配到“<tr>aava</tr>”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。

①“<”匹配字符串的“<”。②“.+”匹配字符串的“tr>aava</tr>ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b”③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。


2、Reluctant(Laziness)( 勉强型 ): 最小匹配

     X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是 最小匹配 ,其实X{n,m}?和X{n }?有些多余。

最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+?再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。


3、Possessive( 占有型 ): 完全匹配

与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。



先看两端代码:

Java代码  收藏代码
  1.         String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";  
  2.         Pattern p = Pattern.compile("/m/t.*/nl/n/p/m");  
  3.         Matcher m = p.matcher(s);  
  4.         while(m.find()) {  
  5.             System.out.println(m.group());  
  6.             System.out.println(m.start());  
  7.             System.out.println(m.end());  
  8.         }  
  9. 运行结果:  
  10. /m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m          
  11. 0  
  12. 40  

 

Java代码  收藏代码
  1.         String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";  
  2.         Pattern p = Pattern.compile("/m/t.*?/nl/n/p/m");  
  3.         Matcher m = p.matcher(s);  
  4.         while(m.find()) {  
  5.             System.out.println(m.group());  
  6.             System.out.println(m.start());  
  7.             System.out.println(m.end());  
  8.         }   
  9. 运行结果:  
  10. /m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m          
  11. 0  
  12. 40  

 

只是在.*后加了一个“?”, 结果就大不一样了。 可以这样说,如果想贪婪匹配,用.*, 如果想勉强匹配,就用.*?。


https://dhexx.cn/news/show-1420114.html

相关文章

渗透测试之信息收集

目录 信息收集 域名信息的收集 公司敏感信息网上搜集 网站指纹识别 整站分析 服务器类型(Linux/Windows) 网站容器(Apache/Nginx/Tomcat/IIS) 脚本类型(php/jsp/asp/aspx) 数据库类型(Mysql/Oracle/Accees/Mqlserver) 主机扫描(Nessus) 端口扫描(nmap) 网站敏感目录…

Nuxt.js 的一个常见错误警告

在 Nuxt.js 的使用过程中会遇到这样一种错误&#xff1a; [Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, …

MySQL 卸载(Windows)

1. 控制面板\所有控制面板项\程序和功能&#xff0c;卸载MySQL 2. 检查MYSQL 目录C:\Program Files (x86)\MySQL下文件是否删除 3. 运行“regedit”&#xff0c;打开注册表&#xff0c;删除文件 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\My…

用Python写一份独特的元宵节祝福

2019独角兽企业重金招聘Python工程师标准>>> 今天是正月十五&#xff0c;首先祝大家元宵节快乐&#xff01; 以前加过我个人VX号的朋友&#xff0c;可以在朋友圈看到我今天发的元宵节祝福图片&#xff1a; 这个祝福文字乍一看其貌不扬&#xff0c;不过点开大图有惊喜…

python3中解析json的模块

目录 python数据与json数据互转 对request请求的json数据格式化 json模块是python中用来解析json数据格式的模块。 json中有两种数据结构:对象和数组。 对象:用大括号表示,由键值对组成,每个键值对用逗号隔开。其中key必须为字符串且是双引号,value可以是多种数据类型。数…

vss整合配置连接到Myeclipse中以及中文配置

配置过很久后 再次配置进行记录以免后续备用 1、下载vss插件和安装vss插件 org.vssplugin_1.6.2 解压到myeclipse 安装路径文件夹C:\MyEclipse 8.5\dropins 下 2.中文语言包配置language 文件夹配置C:\MyEclipse 8.5\dropins 下 即可 重启MyEclipse&#xff0c;插件安装成功 3.…

Mule 官方例子研究

1.准备 安装Mule。这里就不介绍mule的安装了&#xff0c;请参考《Mule安装部署手册》。 2. 编译Mule自带例子中的Hello例子 使用命令行到目录&#xff1a;D:\app\mule3.1.1\examples\hello下&#xff0c;输入&#xff1a;mvn 即可。这里需要安装Maven&#xff1b; 3. 导入Eclip…

《Django By Example》第八章 中文 翻译 (个人学习,渣翻)

书籍出处&#xff1a;https://www.packtpub.com/web-development/django-example 原作者&#xff1a;Antonio Mel &#xff08;译者注&#xff1a;还有4章&#xff01;还有4章全书就翻译完成了&#xff01;&#xff09; 第八章 管理付款和订单 在上一章&#xff0c;你创建了一个…

[互联网]2018年互联网套路简史

新年开篇&#xff0c;回顾2018年互联网套路简史 本文转载自互联网。 “互联网的发展史&#xff0c;就是一部套路发展史&#xff01;”——张小龙 互联网的蓬勃发展&#xff0c;离不开技术作为前提来驱动&#xff0c;但光有技术不行&#xff1b; 因为搞互联网的人&#xff0c;除…

Python资源

python资源全汇总—中文版vinta/awesome-pythonReportLab open-source PDF Toolkit 转载于:https://www.cnblogs.com/wancy86/p/ps.html