Java 正则表达式全攻略(三)
[ 2010-04-23 12:44:39.0 | 作者: 随想 类别: 基础强化
]
来源:网络收集
浏览 2057
labels:Java 正则表达式全攻略(三) java正则表达式 数量词/限定符 Greedy 贪婪 Reluctant 懒惰 Possessive 独占 支配
数量词/限定符
从前面的例子中,我们可以了解到数量词,是用来指定正则表达式的一个给定字符集必须要出现多少次才能满
足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m}
共6种。每种都有Greedy、Reluctant、Possessive三种匹配方式,Greedy是默认的匹配方式。*、+和?限定符都是贪婪的,因
为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现懒惰或最小匹配。不同的匹配方式,对正则表达式的执行方式和性能影响都是十分重要的。
Greedy 贪婪
Greedy量词被看作“贪婪”,因为它们在试图搜索第一个匹配之前读完(或者说吃掉)整个输入字符
串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在输入字符串中后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符
可以后退为止。以下面代码为例(它的输出结果为“xfooxxxxxxfoo”)。
1:
Pattern p = Pattern.compile(".*foo"
);
2:
Matcher m = p.matcher("xfooxxxxxxfoo"
);
3:
while
(m.find()) {
4:
System.out.print(m.group() + "\t"
);
5:
}
假设你想用一个正则表达式匹配一个HTML标签。你知道输入将会是一个有效的HTML文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML标签。 许多正则表达式的新手会首先想到用正则表达式 <.+>
,他们会很惊讶的发现,对于测试字符串,“This is a first
test”,你可能期望会返回,然后继续进行匹配的时候,返回
。 但事实是不会。正则表达式将会匹配“first
”。
很显然这不是我们想要的结果。原因在于Greedy(贪婪)是默认的配置方式。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这
种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。
Reluctant 懒惰
与Greedy完全相反,Reluctant量词被看作“懒惰”:它们从输入字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。以下面代码为例(它的输出结果为“xfoo??? xxxxxxfoo”)。
1:
Pattern p = Pattern.compile(".*?foo"
);
2:
Matcher m = p.matcher("xfooxxxxxxfoo"
);
3:
while
(m.find()) {
4:
System.out.print(m.group() + "\t"
);
5:
}
一个用于修正前面HTML问题的可能方案就是使用惰性代替贪婪性。你可以使用 <.+?>
来完成HTML标签的提取。除此以外可以用一个贪婪重复与一个取反字符集:“ <[^>]+>
”。这是一个更好的方案,它利用了Greedy的特性来提高匹配效率。
Possessive 独占
最后,Possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和Greedy量词不同,Possessive从不后退,即使这样做能允许整体匹配成功。继续以代码为例(这次没有任何输出,因为匹配失败)
1:
Pattern p = Pattern.compile(".*+foo"
);
2:
Matcher m = p.matcher("xfooxxxxxxfoo"
);
3:
while
(m.find()) {
4:
System.out.print(m.group() + "\t"
);
5:
}
这种情况下,.*+消耗整个输入字符串,在表达式的结尾没有剩下满足“foo”的内容。Possessive量词用于处理所有内容,但是从不后退的情况;在没有立即发现匹配的情况下,它的性能优于功能相同的Greedy量词。
分享到:
相关推荐
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...
本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...
在Java编程语言中,正则表达式被广泛应用于数据验证、文本提取和字符串操作。以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,...
Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...
Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...
Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...
Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...
java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效
Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~
Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。在Android开发中,正则表达式尤其重要,因为它们可以帮助我们验证用户输入、处理文本数据或者进行复杂的...
Java正则表达式详解 Java正则表达式是Java语言中的一种模式匹配技术,用于匹配、查找、替换和判断字符串。它是一种强大的工具,能够帮助开发者快速处理字符串相关的任务。 什么是正则表达式? 正则表达式是一种...
Java提供了`java.util.regex`包,通过`Pattern`和`Matcher`类支持正则表达式。以下是如何在Java中验证电话号码的一个例子: ```java import java.util.regex.Pattern; import java.util.regex.Matcher; String...
### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...
Java正则表达式介绍和练习Java正则表达式介绍和练习Java正则表达式介绍和练习
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。在Java中,正则表达式是通过`java.util.regex`包提供的API来实现的。本讲解将深入探讨Java正则表达式的...
Java正则表达式测试工具是面向开发者和爱好者的一款实用程序,它可以帮助用户验证和调试他们的正则表达式。在Java编程环境中,正则表达式是一个强大的字符串处理工具,广泛用于数据验证、文本搜索和替换等任务。这款...