关闭

java学习笔记001之正则表达式贪婪型、勉强型和占有型p299

标签: java正则表达式
828人阅读 评论(0) 收藏 举报
分类:

看java编程思想到p299页,对正则匹配的贪婪型、勉强性和占有型理解不深刻,就在网上找文章看,对贪婪型和勉强性有了基本理解但是对占有型还不是很理解。

后来经过研究发现这里面还是真有一些容易误解的地方,写一篇文章记录一下。

(1)首先是先说正则匹配的基本量词:

x?表示1个或0个x(有没有);   x*表示0个或多个x(统配);  x+表示1个或多个x(累加);   x{n}恰好n个;  x{n,}至少n个x; x{n,m}n到m个x;

(2)接着是三种量词模式的格式:基本量词就是贪婪型,在后面加上“?”表示勉强性,在后面加上“+”表示占有型例如0个或多个x可以分别表示为x*,x*?,x*+

(3)然后是三种量词的功能:下面通过例子说明

public class Main
{
	public static void main(String[] args)
	{
		String str="<aaa<bbb>ccc<ddd>eee>";
		System.out.println(str.replaceAll("<.+>","####"));
		System.out.println(str.replaceAll("<.+?>","####"));
		System.out.println(str.replaceAll("<.++>","####"));
		System.out.println(str.replaceAll("<d++>","####"));
	}
}
结果为:

####
####ccc####eee>
<aaa<bbb>ccc<ddd>eee>
<aaa<bbb>ccc####eee>

下面说明:

贪婪型最好说明即让.+尽可能匹配更多的字符

勉强性是从左到右让.+尽可能匹配最少的字符,这里是第一个误区,并不是匹配最短的,而是从左向右查找过程中没遇到一个可以输出的结果就输出,所以上例中被匹配掉的是<aaa<bbb>和<ddd>   而不是<bbb> <ddd>

对于占有型,它是在贪婪型的基础上不回溯,因为匹配过程是从左到右遍历,对于贪婪型和勉强型为了获得符合要求的结果都要保存很多的中间状态以便回溯。但是对于占有型,它不支持回溯,所以在第三个输出中字符串的第一个<和正则表达式的<匹配,而随后的所以字符串都和.+匹配,这个时候没有字符与>匹配,而对于第四个输出<ddd>的第一个<与正则表达式的<匹配d++与中间的d匹配,>与>匹配,匹配成功。这是第二个误区,许多文章都没有把这个类型看透。

另外需要注意的是,所谓贪婪型、勉强性和占有型只是对于量词而言的并不是对于整个正则表达式。也就是说贪婪型匹配尽量多的字符,勉强性匹配尽量少的字符(从左向右),占有型匹配尽量多的字符并不支持回溯。


0
0
查看评论

Java 正则表达式中量词的贪婪型,勉强型和占有型讲解

今天在做markdown转换器项目时遇到了一个问题,让我回顾了一下正则表达式中量词的贪婪型,勉强型和占有型这三种类型的匹配方式。这些匹配方式在匹配时需要根据项目需求合理地选择搭配,否则程序结果可能完全出乎你的意料。 我的问题是,有如下字符串:“This is [google][1],this is...
  • u010506504
  • u010506504
  • 2015-02-06 19:29
  • 1435

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

在Sun的API中对在对 “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”的描述,不能让我明白他们有什么区别,现在将我对这三种匹配模式的理解写出来,供大家参考。 1、Greediness(贪婪型):最大匹配 X?、X*、X+、X{n,}都是最大匹...
  • xh16319
  • xh16319
  • 2014-05-29 10:56
  • 1538

正则表达式中量词贪婪型和勉强型的讨论(Java语言描述)

在正则表达式的书写量词时,具有贪婪型号、勉强型2种常见类型(Java中还有用于完全匹配的占有型)。刚开始学习时,并没有意识到他们之间的区别。但是在匹配一个例子时,调了好长时间的BUG才意识到原来是匹配模式方面思考不严谨。下面就将几点经验大家共享: 首先是贪婪型和勉强型的区别,贪婪与非贪婪模式影响的...
  • wzq153308
  • wzq153308
  • 2015-06-18 10:03
  • 640

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

对于这三种匹配模式也有叫: “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。 1、Greediness(贪婪型): 最大匹配 X?、X*、X+、X{n,}都是最大匹...
  • lihtdream
  • lihtdream
  • 2014-12-11 16:12
  • 716

贪婪,非贪婪和占有量词的区别

-- Start 我们在 量词 一节中介绍了什么量词以及贪婪与非贪婪量词之间的区别。事实上,通常正则表达式支持以下三种量词。 贪婪量词 非贪婪量词 占有量词 匹配 X?   X?? X?+ 匹配X 0次或1次 X*&...
  • shangboerds
  • shangboerds
  • 2012-05-12 21:13
  • 1552

java正则表达式匹配模式[贪婪型、勉强型、占有型]

对于这三种匹配模式也有叫: “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。 1、Greediness(贪婪型): 最大匹配 X?、X*、X+、X{n,}都是最大匹配。例如...
  • u012515904
  • u012515904
  • 2015-04-08 21:34
  • 397

JAVA 正则表达式的三种模式: 贪婪, 勉强和占有的讨论

假设待处理的字符串是  xfooxxxxxxfoo     模式.*foo (贪婪模式):  模式分为子模式p1(.*)和子模式p2(foo)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型)。  匹配开始时,吃...
  • bigtree_3721
  • bigtree_3721
  • 2016-01-02 17:58
  • 1068

Java正则表达式中量词贪婪型,勉强型,占有型简单描述

今天看《Thinking In java》正则表达式这一节量词有讲到量词特意写了一篇博客来总结。 量词的意思是:描述了一个模式吸入输入文本的方式贪婪型 :java正则表达式默认匹配是贪婪型,就是原始表达式(x?),会 为所有可能的模式发现尽可能多的匹配。 ...
  • qq_36125138
  • qq_36125138
  • 2017-10-18 18:00
  • 44

算法-蓝桥杯习题(4-2)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java。大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 入门训练(详见 算法-蓝桥杯习题(1-1))Go ...
  • RodeStillFaraway
  • RodeStillFaraway
  • 2016-06-11 22:50
  • 2590

[疯狂Java]正则表达式:Java正则表达式语法、贪婪模式/勉强模式

1. 基本字符和特殊字符:     1) 正则表达式前面讲过了,是需要先编译再执行的,因此从某种方面来将正则表达式其实也是一种特殊的编程语言;     2) 既然是编程语言(特殊的编程与语言)那么它就有它自己的源代码字符、关键字等概念了;   ...
  • Lirx_Tech
  • Lirx_Tech
  • 2016-06-20 15:10
  • 1250
    个人资料
    • 访问:27424次
    • 积分:561
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:0篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论