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

news/2024/10/3 19:55:59
在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

相关文章

AHOI2014/JSOI2014 奇怪的计算器

题目描述 题解&#xff1a; 考虑到经过一系列变化后小数不可能比大数大&#xff0c;我们可以用线段树维护区间修改。 重点是&#xff0c;每个节点都可以通过$a[i]a[i]*t1a0[i]*t2t3$这个函数来表示&#xff0c;我们就可以把三个标记一起维护。 代码&#xff1a; #include<cs…

渗透测试之信息收集

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

【以前的空间】倍增

一、 在变化规则相同的情况下加速状态转移&#xff1b; 1、 快速幂 2、 推广&#xff0c;满足两个规则即可&#xff1a; ① 每次的变化规则必须相同&#xff1b; ② 变化规则必须满足结合律。 可用于减少乘法个数或者加法个数 二、 加速区间操作。 在区间操作中运用倍增思想的一…

java GUI编程(swing)之一 swing简单介绍

swing 是由sun公司开发的一个gui框架&#xff0c;一开始sun是开发了awt框架。但是awt框架存在lcd问题。因此sun在awt的基础上继续开发出了swing。 swing是继承了awt的类 swing 常用组件:text 文本组件menus 菜单组件widgets 小控件组件top-level-windows顶层窗口管理sub-window…

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>, …

MULE ESB webservice jms服务

一. 服务调用 1. Mule实现并提供Web Service 在Mule上开发并发布一个Web Service供客户端调用。 示例配置 <flow name"local-ws"> <core:inbound-endpoint address"http://localhost:65082/services/Echo1" exchange-pattern"request-respo…

John the Ripper破解密码

目录 John the Ripper 破解Linux系统密码 破解Windows系统密码 John the Ripper John the Ripper是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出明文,支持目前大多数的加密算法,如DES、MD4、MD5等。它支持多种不同类型的系统架构,包括Unix、Linux、Window…

读取配置文件--AppConfig

using System.Xml;using System.IO;using System;namespace Framework.Common{ /// <summary> /// 用于获取或设置Web.config/*.exe.config中节点数据的辅助类 /// </summary> public sealed class AppConfig { private string filePath; /// <summary> /// …

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…

新年期望

又是新的一年了&#xff0c;进入到oi的第四年&#xff0c;好吧&#xff0c;其实前三年没学啥&#xff0c;这一年希望自己学会更多的算法&#xff0c;成为自己想成为的人&#xff0c;也希望身边的小伙伴们越来越强 我的oi之路可以走的更远&#xff0c;加油啊&#xff0c;hale 当…