例如,有字符串fatcatfatcatfat,假设既有正则表达式模式为"cat",第一次匹配后调用appendReplacement(sb,"dog"),那么这时StringBuffer sb的内容为fatdog,也就是fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里,而第二次匹配后调用appendReplacement(sb,"dog"),那么sb的内容就变为fatdogfatdog,如果最后再调用一次appendTail(sb),那么sb最终的内容将是fatdogfatdogfat。
还是有点模糊?那么我们来看个简单的程序:
//该例将把句子里的"Kelvin"改为"Kevin"
import java.util.regex.*;
public class MatcherTest{
public static void main(String[] args)
throws Exception {
//生成Pattern对象并且编译一个简单的正则表达式"Kelvin"
Pattern p = Pattern.compile("Kevin");
//用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company");
StringBuffer sb = new StringBuffer();
int i=0;
//使用find()方法查找第一个匹配的对象
boolean result = m.find();
//使用循环将句子里所有的kelvin找出并替换再将内容加到sb里
while(result) {
i++;
m.appendReplacement(sb, "Kevin");
System.out.println("第"+i+"次匹配后sb的内容是:"+sb);
//继续查找下一个匹配对象
result = m.find();
}
//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("调用m.appendTail(sb)后sb的最终内容是:"+ sb.toString());
}
}
最终输出结果为:
第1次匹配后sb的内容是:Kevin
第2次匹配后sb的内容是:Kevin Li and Kevin
第3次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin
第4次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin
调用m.appendTail(sb)后sb的最终内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company.
看了上面这个例程是否对appendReplacement(),appendTail()两个方法的使用更清楚呢,如果还是不太肯定最好自己动手写几行代码测试一下。
★group()/group(int group)/groupCount():
该系列方法与我们在上篇介绍的Jakarta-ORO中的MatchResult .group()方法类似(有关Jakarta-ORO请参考上篇的内容),都是要返回与组匹配的子串内容,下面代码将很好解释其用法:
import java.util.regex.*;
public class GroupTest{
public static void main(String[] args)
throws Exception {
Pattern p = Pattern.compile("(ca)(t)");
Matcher m = p.matcher("one cat,two cats in the yard");
StringBuffer sb = new StringBuffer();
boolean result = m.find();
System.out.println("该次查找获得匹配组的数量为:"+m.groupCount());
for(int i=1;i<=m
}
}
输出为:
该次查找获得匹配组的数量为:2
第1组的子串内容为:ca
第2组的子串内容为:t
Matcher对象的其他方法因比较好理解且由于篇幅有限,请读者自己编程验证。
4.一个检验Email地址的小程序:
最后我们来看一个检验Email地址的例程,该程序是用来检验一个输入的EMAIL地址里所包含的字符是否合法,虽然这不是一个完整的EMAIL地址检验程序,它不能检验所有可能出现的情况,但在必要时您可以在其基础上增加所需功能。
import java.util.regex.*;
public class Email {
public static void main(String[] args) throws Exception {
String input = args[0];
//检测输入的EMAIL地址是否以 非法符号"."或"@"作为起始字符
Pattern p = Pattern.compile("^\.|^\@");
Matcher m = p.matcher(input);
if (m
//检测是否以"www."为起始
p = Pattern.compile("^www\.");
m = p.matcher(input);
if (m
//检测是否包含非法字符
p = Pattern.compile("[^A-Za-z0-9\.\@_\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
//如果找到了非法字符那么就设下标记
deletedIllegalChars = true;
//如果里面包含非法字符如冒号双引号等,那么就把他们消去,加到SB里面
m.appendReplacement(sb, "");
result = m.find();
}
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
System.out.println("输入的EMAIL地址里包含有冒号、逗号等非法字符,请修改");
System.out.println("您现在的输入为: "+args[0]);
System.out.println("修改后合法的地址应类似: "+input);
}
}
}
例如,我们在命令行输入:java Email www.kevin@163.net
那么输出结果将会是:EMAIL地址不能以'www.'起始
如果输入的EMAIL为@kevin@163.net
则输出为:EMAIL地址不能以'.'或'@'作为起始字符
当输入为:cgjmail#$%@163.net
那么输出就是:
输入的EMAIL地址里包含有冒号、逗号等非法字符,请修改
您现在的输入为: cgjmail#$%@163.net
修改后合法的地址应类似: cgjmail@163.net
5.总结:
本文介绍了jdk1.4.0-beta3里正则表达式库--java.util.regex中的类以及其方法,如果结合与上一篇中所介绍的Jakarta-ORO API作比较,读者会更容易掌握该API的使用,当然该库的性能将在未来的日子里不断扩展,希望获得最新信息的读者最好到及时到SUN的网站去了解。
6.结束语:
本来计划再多写一篇介绍一下需付费的正则表达式库中较具代表性的作品,但觉得既然有了免费且优秀的正则表达式库可以使用,何必还要去找需付费的呢,相信很多读者也是这么想的:,所以有兴趣了解更多其他的第三方正则表达式库的朋友可以自己到网上查找或者到我在参考资料里提供的网址去看看。
参考资料
java.util.regex的帮助文档
Dana Nourie 和Mike McCloskey所写的Regular Expressions and the Java™ Programming Language
需要更多的第三方正则表达式资源以及基于它们所开发的应用程序请看http://www.meurrens.org/ip-Links/java/regex/index.html
分享到:
相关推荐
本资源集合了Java开发中的核心组件JDK、前端JavaScript库JQuery以及编程语言通用的正则表达式API,这些都是IT开发中不可或缺的重要工具和知识。 首先,JDK(Java Development Kit)是Java编程语言的核心,由Oracle...
本文将对正则表达式的基础知识进行详细的介绍,从什么是正则表达式开始,逐步深入浅出地讲解正则表达式的基本概念、正则表达式引擎、文字符号、特殊字符、不可显示字符、正则表达式引擎的内部工作机制等。...
CSS2.0-CSS3.0-HTML5-JavaScript-JDK1.8-正则表达式,全中文帮助文档,全都是CHM版 里面包含15个CHM文件,其中有六大类,有的有多个版本全是中文版 CSS2.0就标准的一个版本,够用了 CSS3.0有P零雾雨版,ISD版还有,...
2. **正则表达式引擎** 正则表达式引擎是处理正则表达式并进行匹配的软件组件。常见的正则表达式引擎类型有 Perl 5 类型,它们广泛应用于各种编程语言和工具。不同的引擎可能在语法和功能上存在差异,比如 .NET ...
Java 正则表达式过滤特殊字符的正则表达式 Java 正则表达式是 Java 语言中的一种强大的文本处理工具,能够对字符串进行复杂的匹配、提取和替换操作。本文将详细介绍 Java 正则表达式在过滤特殊字符方面的应用。 ...
综上所述,这个压缩包是一个综合性的开发和测试工具集合,涵盖了从代码编写(JDK 1.8)、正则表达式测试、远程服务器管理(CRT)、API接口测试(SoupUI)到服务器监控(ServerAgent)的各个环节。对于Java开发者、...
总之,Java语言通过java.util.regex包提供了一套功能齐全的正则表达式API,让Java开发者能够在不需要第三方库支持的情况下,轻松地在程序中使用正则表达式的强大功能。随着Java对正则表达式支持的深入,越来越多的...
Perl 5引擎的正则表达式功能强大且灵活,其他如.NET和JDK的正则库虽然相似,但也有细微差别。 在正则表达式中,有一些字符具有特殊含义,被称为元字符,包括:[ ] \ ^ $ . | ? * + ( )。如果要匹配这些字符本身,就...
虽然当前版本的JDK还没有内置完整的正则表达式支持,但我们可以使用Jakarta-ORO库来实现。Jakarta-ORO是一个开源项目,提供了强大的正则表达式处理能力。 #### 3.1 使用Jakarta-ORO库 1. **下载与安装**:首先从...
尤其在Java中,自JDK1.4开始,正则表达式已成为内置功能,无需依赖第三方库即可使用,极大地提高了编程效率和灵活性。 #### 二、Java正则表达式的来源与特点 Java正则表达式的语法受到了Perl语言的影响,后者被...
该工具可用于正则表达式的测试,该工具使用的可运行jar包JDK11编译,请使用JDK11及以上版本运行jar,资源附带源码,JDK版本不到JDK11的网友可自行编译运行。此为老版本,添加了一些小功能的新版本已上传,...
在JAVA中,正则表达式的使用基于`java.util.regex`包,提供了`Pattern`和`Matcher`两个主要类。`Pattern`类用于编译正则表达式,而`Matcher`类则是用来在给定的输入字符串上执行匹配操作的。 1. **正则表达式基础**...
2. **不同类型的正则表达式引擎**:正则表达式引擎是指能够处理正则表达式的软件组件。这些引擎通常作为更大程序的一部分存在。目前,市面上有许多不同的正则表达式引擎,它们之间的兼容性各不相同。本文主要关注的...
在Java中,正则表达式是通过java.util.regex包提供的API来实现的。本工具"正则表达式验证工具Java"专注于帮助开发者测试和验证他们的正则表达式,确保其能够按预期工作。 该工具的核心功能在于提供了一个用户友好的...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,自JDK1.4版本起被引入。它源于PHP并迅速流行,主要用于复杂字符串的验证和处理。正则表达式可以高效地完成对字符串的检查、分割、替换等任务。 ### 一、...
- **其他类型引擎**:如.NET 的正则表达式库、Java 的 JDK 正则表达式包等,虽然与 Perl5 类型相似,但在细节上有所差异。 **引擎的工作机制**: - **文本导向引擎**(DFA,Deterministic Finite Automaton):这类...