如何使用正则表达式

功能及具体实例,一定要有源代码和说明
希望能有人格我做一个用记事本可以编写的正则表达式程序实例并给出注释。不胜感激。

在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包。

可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式。正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性。在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛。

正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等。此外,许多使用比较广泛的脚本语言也支持正则表达式,比如Python,Tcl,JavaScript,以及最著名的Perl。

我很早以前就是个Perl方面的黑客,如果你和我一样话,你也会非常依赖你手边的这些强大的text-munging工具。近几年来,像其他程序开发者一样,我也越来越关注Java的开发。

Java作为一种开发语言,有许多值得推荐的地方,但是它一直以来没有自带对正则表达式的支持。直到最近,借助于第三方的类库,Java开始支持正则表达式,但这些第三方的类库都不一致、兼容性差,而且维护代码起来很糟糕。这个缺点,对我选择Java作为首要的开发工具来说,一直是个巨大的顾虑之处。

你可以想象,当我知道Sun的Java JDK 1.40版本包含了java.util.regex(一个完全开放、自带的正则表达式包)时,是多么的高兴!很搞笑的说,我花好些时间去挖掘这个被隐藏起来的宝石。我非常惊奇的是,Java这样的一个很大改进(自带了java.util.regex包)为什么不多公开一点呢?!

最近,Java双脚都跳进了正则表达式的世界。java.util.regex包在支持正则表达也有它的过人之处,另外Java也提供详细的相关说明文档。使得朦朦胧胧的regex神秘景象也慢慢被拨开。有一些正则表达式的构成(可能最显著的是,在于糅合了字符类库)在Perl都找不到。

在regex包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。另加一个新的例外类,PatternSyntaxException,当遇到不合法的搜索模式时,会抛出例外。

即使对正则表达式很熟悉,你会发现,通过java使用正则表达式也相当简单。要说明的一点是,对那些被Perl的单行匹配所宠坏的Perl狂热爱好者来说,在使用java的regex包进行替换操作时,会比他们所以前常用的方法费事些。

本文的局限之处,它不是一篇正则表达式用法的完全教程。如果读者要对正则表达进一步了解的话,推荐阅读Jeffrey Frieldl的Mastering Regular Expressions,该书由O’Reilly出版社出版。我下面就举一些例子来教读者如何使用正则表达式,以及如何更简单地去使用它。

设计一个简单的表达式来匹配任何电话号码数字可能是比较复杂的事情,原因在于电话号码格式有很多种情况。所有必须选择一个比较有效的模式。比如:(212) 555-1212, 212-555-1212和212 555 1212,某些人会认为它们都是等价的。

首先让我们构成一个正则表达式。为简单起见,先构成一个正则表达式来识别下面格式的电话号码数字:(nnn)nnn-nnnn。

第一步,创建一个pattern对象来匹配上面的子字符串。一旦程序运行后,如果需要的话,可以让这个对象一般化。匹配上面格式的正则表达可以这样构成:(\d{3})\s\d{3}-\d{4},其中\d单字符类型用来匹配从0到9的任何数字,另外{3}重复符号,是个简便的记号,用来表示有3个连续的数字位,也等效于(\d\d\d)。\s也另外一个比较有用的单字符类型,用来匹配空格,比如Space键,tab键和换行符。

是不是很简单?但是,如果把这个正则表达式的模式用在java程序中,还要做两件事。对java的解释器来说,在反斜线字符(\)前的字符有特殊的含义。在java中,与regex有关的包,并不都能理解和识别反斜线字符(\),尽管可以试试看。但为避免这一点,即为了让反斜线字符(\)在模式对象中被完全地传递,应该用双反斜线字符(\)。此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(\)。也就是像下面的一样:

\\(\\d{3}\\)\\s\\d{3}-\\d{4}

现在介绍怎样在java代码中实现刚才所讲的正则表达式。要记住的事,在用正则表达式的包时,在你所定义的类前需要包含该包,也就是这样的一行:

import java.util.regex.*;

下面的一段代码实现的功能是,从一个文本文件逐行读入,并逐行搜索电话号码数字,一旦找到所匹配的,然后输出在控制台。

BufferedReader in;

Pattern pattern = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");

in = new BufferedReader(new FileReader("phone"));

String s;

while ((s = in.readLine()) != null)

{

Matcher matcher = pattern.matcher(s);

if (matcher.find())

{

System.out.println(matcher.group());

}

}

in.close();

对那些熟悉用Python或Javascript来实现正则表达式的人来说,这段代码很平常。在Python和Javascript这些语言中,或者其他的语言,这些正则表达式一旦明确地编译过后,你想用到哪里都可以。与Perl的单步匹配相比,看起来多多做了些工作,但这并不很费事。

find()方法,就像你所想象的,用来搜索与正则表达式相匹配的任何目标字符串,group()方法,用来返回包含了所匹配文本的字符串。应注意的是,上面的代码,仅用在每行只能含有一个匹配的电话号码数字字符串时。可以肯定的说,java的正则表达式包能用在一行含有多个匹配目标时的搜索。本文的原意在于举一些简单的例子来激起读者进一步去学习java自带的正则表达式包,所以对此就没有进行深入的探讨。

这相当漂亮吧! 但是很遗憾的是,这仅是个电话号码匹配器。很明显,还有两点可以改进。如果在电话号码的开头,即区位号和本地号码之间可能会有空格。我们也可匹配这些情况,则通过在正则表达式中加入\s?来实现,其中?元字符表示在模式可能有0或1个空格符。

第二点是,在本地号码位的前三位和后四位数字间有可能是空格符,而不是连字号,更有胜者,或根本就没有分隔符,就是7位数字连在一起。对这几种情况,我们可以用(-|)?来解决。这个结构的正则表达式就是转换器,它能匹配上面所说的几种情况。在()能含有管道符|时,它能匹配是否含有空格符或连字符,而尾部的?元字符表示是否根本没有分隔符的情况。

最后,区位号也可能没有包含在圆括号内,对此可以简单地在圆括号后附上?元字符,但这不是一个很好的解决方法。因为它也包含了不配对的圆括号,比如"(555" 或 "555)"。相反,我们可以通过另一种转换器来强迫让电话号码是否带有有圆括号:(\(\d{3}\)|\d{3})。如果我们把上面代码中的正则表达式用这些改进后的来替换的话,上面的代码就成了一个非常有用的电话号码数字匹配器:

Pattern pattern =

Pattern.compile("(\\(\\d{3}\\)|\\d{3})\\s?\\d{3}(-|)?\\d{4}");

可以确定的是,你可以自己试着进一步改进上面的代码。

现在看看第二个例子,它是从Friedl的中改编过来的。其功能是用来检查文本文件中是否有重复的单词,这在印刷排版中会经常遇到,同样也是个语法检查器的问题。

匹配单词,像其他的一样,也可以通过好几种的正则表达式来完成。可能最直接的是\b\w+\b,其优点在于只需用少量的regex元字符。其中\w元字符用来匹配从字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,\b元字符是用来说明匹配单词的边界,它可以是空格或任何一种不同的标点符号(包括逗号,句号等)。

现在,我们怎样来检查一个给定的单词是否被重复了三次?为完成这个任务,需充分利用正则表达式中的所熟知的向后扫描。如前面提到的,圆括号在正则表达式中有几种不同的用法,一个就是能提供组合类型,组合类型用来保存所匹配的结果或部分匹配的结果(以便后面能用到),即使遇到有相同的模式。在同样的正则表达中,可能(也通常期望)不止有一个组合类型。在第n个组合类型中匹配结果可以通过向后扫描来获取到。向后扫描使得搜索重复的单词非常简单:\b(\w+)\s+\1\b。

圆括号形成了一个组合类型,在这个正则表示中它是第一组合类型(也是仅有的一个)。向后扫描\1,指的是任何被\w+所匹配的单词。我们的正则表达式因此能匹配这样的单词,它有一个或多个空格符,后面还跟有一个与此相同的单词。注意的是,尾部的定位类型(\b)必不可少,它可以防止发生错误。如果我们想匹配"Paris in the the spring",而不是匹配"Java's regex package is the theme of this article"。根据java现在的格式,则上面的正则表达式就是:Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b");

最后进一步的修改是让我们的匹配器对大小写敏感。比如,下面的情况:"The the theme of this article is the Java's regex package.",这一点在regex中能非常简单地实现,即通过使用在Pattern类中预定义的静态标志CASE_INSENSITIVE :

Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b",

Pattern.CASE_INSENSITIVE);

有关正则表达式的话题是非常丰富,而且复杂的,用Java来实现也非常广泛,则需要对regex包进行的彻底研究,我们在这里所讲的只是冰山一角。即使你对正则表达式比较陌生,使用regex包后会很快发现它强大功能和可伸缩性。如果你是个来自Perl或其他语言王国的老练的正则表达式的黑客,使用过regex包后,你将会安心地投入到java的世界,而放弃其他的工具,并把java的regex包看成是手边必备的利器。

参考资料:http://new.cnitn.cn/gb/news/bbs/dispbbs.asp?boardid=20&id=5487&page=1

温馨提示:内容为网友见解,仅供参考
第1个回答  2005-11-06
参考java1。4。2,有支持正则式编程,使用很简单

正则表达式怎么在EXCEL使用
1、首先选中Excel表格,双击打开。2、然后在该界面中,选中要使用正则表达式的单元格。3、再者在该界面中,公式栏中输入正则表达式的公式“=RegexString(A1,"([\\d]+)",1)”。4、其次在该界面中,单元格里显示正则表达式结果。5、继续在该界面中,选中单元格,向下拖动。6、最后在该界面中,成功显...

怎么用正则表达式验证密码是否正确呢?
为实现密码长度为8~20个字符,且需同时包含数字、大写字母和小写字母的要求,可以使用正则表达式进行验证。下面是一个简单的正则表达式示例:^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,20} 解释:^:匹配字符串的开始位置 (?=.*[0-9]):正向预查,表示字符串中必须包含至少一个数字...

正则表达式的使用有什么技巧吗?
①pattern类:<font color=red>pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。②Matcher类:Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Patte...

怎么使用电脑Excel的正则表达式一键提取英文内容
具体如下:1. 第一步,打开电脑上的excel表格。2. 第二步,复制内容然后再空白处粘贴。3. 第三步,选中粘贴的内容。4. 第四步,点击上方菜单栏中的方方格子按钮。5. 第五步,点击弹出页面中的更多按钮,然后点击正则表达式。6. 第六步,在弹出页面中点击选择提取按钮,然后在正则表达式输入框中输...

正则提取中间的内容?
正则表达式是一种文本模式匹配工具,可以用来提取文本中的指定信息。如果你想使用正则表达式来提取上面的文本中的【Default9】,可以使用下面的正则表达式:这个表达式会匹配文本中以 Dialogue: 开头,后面跟着任意字符,然后以一个逗号结尾的部分。它会提取括号中的内容,即【Default9】。例如,在使用 Python ...

JS的正则表达式如何使用
学好正则表达式很重要,下面是一些关于正则表达式的基本知识整理\\ : 转义字符^ : 匹配字符串开始位置$ : 匹配字符串结束位置* : 匹配前面的表达式任意次+ : 匹配前面的表达式一次或多次? : 匹配前面的表达式零次或一次{n} : 匹配确定的n次,n为非负整数{n,} : 匹配至少n次,n为非负整数{n,m...

在C\/C++语言中使用正则表达式
正则表达式一般简写为regex或者regexp,甚至是RE。关于正则表达式的介绍,有很多的文章,用搜索引擎查找就可以找到很不错的使用说明。但是在C\/C++语言中如何去使用,相应的介绍比较缺乏。大多数C标准库自带regex,可以通过\/usr\/include\/regex.h去看,或者man regex看使用说明。perl,php等语言更是提供了功能强大的正则表达式...

MySQL正则表达式使用详解mysql中使用正则
1. REGEXP:检查一个字符串是否与正则表达式匹配。2. RLIKE:检查一个字符串是否与正则表达式匹配,与REGEXP相同。3. REGEXP_REPLACE:替换匹配正则表达式的子字符串。4. REGEXP_INSTR:返回与正则表达式匹配的字符串的位置。示例代码 以下是一个例子,用于说明MySQL正则表达式的使用方法:SELECT * FROM...

如何在notepad++中用正则表达式匹配每行第一次出现的0?
若需要忽略空格或tab,并且想要匹配行首直接就是0的情况,则将`+`替换为`*`:`(?i)^[^.]*0*`。`*`表示匹配零次或多次前面的字符,这样即使行首有空格或tab,只要紧随其后的是0,正则表达式也能够正确匹配。总结起来,要使用Notepad++中正则表达式匹配每行第一次出现的0,可以根据具体情况选择适当...

如何在Notepad++中使用正则表达式去重?
使用方法:打开Notepad++,在“查找与替换”功能中,输入正则表达式^(.*?)$\\s+?^(?=.*^\\1$)。这里的^(.*?)$部分匹配整个文本,\\s+?表示可选的空格或制表符,而^(?=.*^\\1$)确保重复的文本被正确识别并替换。接下来,进行替换操作。在“替换为”框中输入空字符串,表示替换为无内容。

相似回答
大家正在搜