Java 正则表达式匹配模式(贪婪型、勉强型、占有型)

Greediness(贪婪型):最大匹配

X?、X*、X+、X{n,} 是最大匹配。例如你要用 “<.+>” 去匹配 “a<tr>aava </tr>abb”,也许你所期待的结果是想匹配 “<tr>”,但是实际结果却会匹配到 “<tr>aava </tr>。

在 Greediness 的模式下,会尽量大范围的匹配,直到匹配了整个内容,这时发现匹配不能成功时,开始回退缩小匹配范围,直到匹配成功

String test = "a<tr>aava </tr>abb "; String reg = "<.+>"; System.out.println(test.replaceAll(reg, "###"));

输出:a###abb

Reluctant(Laziness)(勉强型):最小匹配
X??、X*?、X+?、X{n,}? 是最小匹配,其实X{n,m}?和X{n }?有些多余。在 Greediness 模式之后添加 ? 就成最小匹配。

在 Reluctant 的模式下,只要匹配成功,就不再继续尝试匹配更大范围的内容

String test = "a<tr>aava </tr>abb "; String reg = "<.+?>"; System.out.println(test.replaceAll(reg, "###"));

输出:a###aava ###abb

与 Greediness 不同,Reluctant 模式下匹配了两次内容

Possessive(占有型):完全匹配
X?+、X*+、X++、X{n,}+ 是完全匹配,在 Greediness 模式之后添加 + 就成完全匹配。

Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范围。

String test = "a<tr>aava </tr>abb "; String reg = "<.++>"; String test2 = "<tr>"; String reg2 = "<tr>"; System.out.println(test.replaceAll(reg, "###")); System.out.println(test2.replaceAll(reg2, "###"));

输出:a<tr>aava </tr>abb

时间: 2024-12-26 17:19:55

Java 正则表达式匹配模式(贪婪型、勉强型、占有型)的相关文章

Java正则表达式匹配电话格式_java

大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. /** * 手机号:目前全国有27种手机号段. * 移动有16个号段:134.135.136.137.138.139.147.150.151.152.157.158.159.182.187.188.其中147.157.188是3G号段,其

字符串-java正则表达式匹配数字

问题描述 java正则表达式匹配数字 G3811/ G3885/ G655/l G030/l G3849/ G0150/ G5292/ G955/l G025/l G5300/ 这是控制台输出的字符串,但是我只想要他的数字 怎么匹配 解决方案 Pattern p = Pattern.compile("[0-9]"); Matcher m = p.matcher(elem.attr("abs:href").substring(22, 28)); while (m.fi

java正则表达式匹配问题

问题描述 java正则表达式匹配问题 我现在有一个字符串 String str= "[权利要求 5] 如权利要求 4所述 的墨盒 ,其特征在于 :" 想要提取到第几号权力要求 Pattern p = Pattern.compile("^[权利要求 (d)]"); Matcher m = p.matcher(str); if(m.find()){ System.out.println("["+m.group()+"]"); }

java正则表达式匹配斜杠

在正则表达式里面匹配一个斜杠,需要用4个斜杠: Java代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String textString = new String ("\\\&q

PHP 正则表达式匹配模式学习笔记

PHP中对于正则处理文本提供了两种方式,一种是PCRE方式(PCRE库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当前的实现对应于perl 5.005.):另一个是POSIX方式.   PCRE函数库中的函数使用的模式语法非常类似perl. 表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母数字, 除反斜杠()和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4

java正则表达式匹配网页所有网址和链接文字的示例_java

复制代码 代码如下: import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.

关于java正则表达式匹配url

问题描述 Pattern pattern=Pattern.compile(正则表达式); Matcher m=pattern.matcher("http://www.123.com/234/333.html"); //除中文不用外,其他的都要 if(m.find()){System.out.println(m.find());System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.

java 正则表达式匹配

问题描述 需要匹配的文本内容形如:words,"Reference": ["""words""","""words""","""words"""] wordswords中可能包含任意字符,但不包含三引号.我需要抽取[]中的内容,代码如下,结果是没有匹配reg = ""Reference&q

java 正则表达式-JAVA正则表达式无法匹配

问题描述 JAVA正则表达式无法匹配 不知道怎么贴图.用JAVA正则表达式匹配的,为什么在系统程序里find()出来一直就是false.然而直接写个类,用相同的正则,相同的匹配条件,就能够正常的匹配出来.请问这个是什么情况?? 解决方案 我自己查了一下,是在解析正则字符串的时候,这个转义字符没有给我解析.所以现在的问题是,它为什么没有给我解析??