正则表达式简化模式匹配的代码精品资料.doc





《正则表达式简化模式匹配的代码精品资料.doc》由会员分享,可在线阅读,更多相关《正则表达式简化模式匹配的代码精品资料.doc(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、java正则表达式; regular expression日期:2005-7-11 15:58:39 人气:0 大 中 小Java 101 正则表达式简化模式匹配的代码 探索在文本处理场合下涉及模式匹配中正则表达式的优雅之处。 概要文本处理经常涉及的根据一个pattern的匹配。尽管java的character和assorted 的String类提供了low-level的pattern-matching支持,这种支持一般带来了复杂的代码。为了帮助你书写简单的pattern-matching代码,java提供了regular expression。在介绍给你术语和java.util.regex包
2、之后,Jeff Friesen explores 了许多那个包的Pattern类支持的正则表达式结构。然后他examines 了Pattern的方法和附加的java.util.regex 类。作为结束,他提供了一个正则表达式的实践应用。 为察看术语列表,提示与警告,新的homework,上个月homework的回答,这篇文章的相关材料,请访问study guide. (6,000 words; February 7, 2003) By Jeff Friesen ,Translated By humx文本处理经常的要求依据特定pattern匹配的代码。它能让文本检索,email header验证
3、,从普通文本的自定义文本的创建(例如,用Dear Mr. Smith 替代 Dear Customer),等等成为可能。Java通过character和assorted string类支持pattern matching。由于low-level的支持一般带来了复杂的pattern-matching代码,java同时提供了regular expression来简代码。Regular expressions经常让新手迷惑。然而, 这篇文章驱散了大部分混淆。在介绍了regular expression术语,java.util.regex 包中的类, 和一个regular expression con
4、structs的示例程序之后, 我explore了许多Pattern类支持的regular expression constructs。我也examine了组成Pattern 和java.util.regex 包中其它类的方法。一个practical 的正则表达式的应用程序结束了我的讨论。 Note Regular expressions的漫长历史开始于计算机科学理论领域自动控制原理和formal 语言理论。它的历史延续到Unix和其它的操作系统,在那里正则表达式被经常用作在Unix和Unix-like的工具中:像awk(一个由其创作者,Aho, Weinberger, and Kernigh
5、an,命名,能够进行文本分析处理的编程语言), emacs (一个开发工具),和grep (一个在一个或多个文件中匹配正则表达式,为了全局地正则表达式打印的工具。 什么是正则表达式? A regular expression,也被known as regex or regexp,是一个描述了一个字符串集合的pattern(template)。这个pattern决定了什么样的字符串属于这个集合,它由文本字符和元字符(metacharacters,由有特殊的而不是字符含义的字符)组成。为了识别匹配的检索文本的过程字符串满足一个正则表达式称作模式匹配(pattern matching)。Javas
6、java.util.regex 包通过Pattern,Matcher类和PatternSyntaxException异常支持pattern matching: Pattern 对象,被known as patterns,是编译的正则表达式。 Matcher 对象,或者matchers,在,实现了java.lang.CharSequence接口并作为文本source的字符序列中定位解释matchers的引擎。 PatternSyntaxException 对象描述非法的regex patterns。Listing 1 介绍这些类: Listing 1. RegexDemo.java / Rege
7、xDemo.javaimport java.util.regex.*;class RegexDemo public static void main (String args) if (args.length != 2) System.err.println (java RegexDemo regex text);return;Pattern p;try p = Ppile (args 0);catch (PatternSyntaxException e) System.err.println (Regex syntax error: + e.getMessage (); System.err
8、.println (Error description: + e.getDescription (); System.err.println (Error index: + e.getIndex (); System.err.println (Erroneous pattern: + e.getPattern (); return;String s = cvtLineTerminators (args 1);Matcher m = p.matcher (s);System.out.println (Regex = + args 0);System.out.println (Text = + s
9、);System.out.println ();while (m.find () System.out.println (Found + m.group (); System.out.println (starting at index + m.start () + and ending at index + m.end (); System.out.println (); / Convert n and r character sequences to their single character / equivalents static String cvtLineTerminators
10、(String s) StringBuffer sb = new StringBuffer (80);int oldindex = 0, newindex;while (newindex = s.indexOf (n, oldindex) != -1) sb.append (s.substring (oldindex, newindex); oldindex = newindex + 2; sb.append (n);sb.append (s.substring (oldindex);s = sb.toString ();sb = new StringBuffer (80);oldindex
11、= 0;while (newindex = s.indexOf (r, oldindex) != -1) sb.append (s.substring (oldindex, newindex); oldindex = newindex + 2; sb.append (r);sb.append (s.substring (oldindex);return sb.toString (); RegexDemos public static void main(String args) 方法validates 两个命令行参数:一个指出正则表达式,另外一个指出文本。在创建一个pattern之后,这个方法
12、转换所有的文本参数,new-line and carriage-return line-terminator 字符序列为它们的实际meanings 。例如,一个new-line字符序列(由反斜杠后跟n表示)转换成一个new-line字符(用数字表示为10)。在输出了regex和被转换的命令行文本参数之后,main(String args) 方法从pattern创建了一个matcher,它随后查找了所有的matches 。对于每一个match,它所出现的字符和信息的位置被输出。为了完成模式匹配,RegexDemo 调用了java.util.regex包中类的不同的方法。不要使你自己现在就理解这些
13、方法;我们将在后边的文章探讨它们。更重要的是,编译 Listing 1: 你需要RegexDemo.class来探索Patterns regex 结构。探索Patterns regex 构造Patterns SDK 文档提供了一部分正则表达式结构的文档。除非你是一个avid正则表达式使用者,一个最初的那段文档的阅读会让你迷惑。什么是quantifiers,greedy之间的不同是什么, reluctant, 和 possessive quantifiers? 什么是 character classes, boundary matchers, back references, 和 embedde
14、d flag expressions? 为了回答这些和其它的问题,我们探索了许多Patter认可的regex constructs或 regex pattern 种类。我们从最简单的regex construct 开始:literal strings。Caution 不要认为Pattern和Perl5的正则表达式结构是一样的。尽管他们有很多相同点,他们也有许多,它们支持的metacharacters结构的不同点。 (更多信息,察看在你的平台上的你的SDK Pattern类的文档。) Literal strings 当你在字处理软件的检索对话框输入一个你指定一个literal string 的时
15、候,你就指定了一个regex expression construct 。执行以下的RegexDemo 命令行来察看一下这个regex construct 的动作: java RegexDemo apple applet上边的这个命令行确定了apple 作为一个包含了字符a, p, p, l, and e(依次)的字符regex construct。 这个命令行同时也确定了applet 作为pattern-matching的文本。执行命令行以后,看到以下输出: Regex = appleText = appletFound applestarting at index 0 and ending
16、 at index 5输出的regex 和text 命令行,预示着在applet中一个applet的成功的匹配,并表示了匹配的开始和结束的索引:分别为0和5。开始索引指出了一个pattern match出现的第一个文本的开始位置,结束索引指明了这个match后的第一个text的位置。换句话说,匹配的text的范围包含在开始索引和去掉结束索引之间(不包含结束索引)。Metacharacters 尽管string regex constructs 是有用的,更强大的regex contsruct联合了文本字符和元字符。例如,在a.b,这个句点metacharacter (.) 代表在a个b之间出现
17、的任何字符。 为了察看元字符的动作, 执行以下命令行: java RegexDemo .ox The quick brown fox jumps over the lazy ox.以上命令指出.ox 作为regex ,和The quick brown fox jumps over the lazy ox.作为文本源text。RegexDemo 检索text来匹配以任意字符开始以ox结束的match,并产生如下输出: Regex = .oxText = The quick brown fox jumps over the lazy ox.Found foxstarting at index 16
18、 and ending at index 19Foundoxstarting at index 39 and ending at index 42这个输出展示了两个matches:fox和ox。. metacharacter 在第一个match中匹配f ,在第二个match中匹配空格。假如我们用前述的metacharacter 替换.ox会怎么样呢?也就是,我们指定java RegexDemo . The quick brown fox jumps over the lazy ox.会有什么样的输出,因为period metacharacter 匹配任何字符, RegexDemo 在命令行输出
19、每一个匹配字符,包括结尾的period字符。 Tip 为了指定.或者任何的元字符作为在一个regex construct 作为literal character,引用转换meta状态到literal status用以下两种方法之一: 在元字符之前放置反斜杠。 将元字符放在Q和E之间(例如:Q.E)。在每种情形下,不要忘记在string literal(例如:String regex = .;)中出现时(像 . or Q.E)的双倍的反斜杠。不要在当它在命令行参数中出现的时候用双倍的反斜杠。 Character classes 有时我们限定产生的matches到一个特定的字符集和。例如,我们可以
20、检索元音a, e, i, o, and u ,任何一个元音字符的出现都以为着一个match。A character类, 通过在方括号之间的一个字符集和指定的regex construct ,帮我们完成这个任务。Pattern 支持以下的character classes: 简单字符: 支持被依次放置的字符串并仅匹配这些字符。例如:abc 匹配字符a, b, and c。以下的命令行提供了另外一个示例: java RegexDemo csw cavejava RegexDemo csw cave csw中c匹配在cave中的c。没有其它的匹配存在。 否定: 以 metacharacter 元字符
21、开始且仅匹配没有在class中出现的字符。例如:abc匹配所有除了a, b, 和c以外的字符,以下的命令行提供了另外一个示例: java RegexDemo csw cavejava RegexDemo csw cave 匹配在cave中遇到的a, v, 和e。没有其它的匹配存在。 范围: 包含在元字符(-)左侧的字符开始,元字符(-)右侧字符结束的所有字符。仅匹配在范围内的字符。例如: a-z 匹配所有的小写字母。以下的命令行提供了另外一个示例: java RegexDemo a-c clownjava RegexDemo a-c clown 匹配在clown中的c。没有其它的匹配存在。 T
22、ip 通过将它们放置在一起来在一个range character class内联合多个范围。例如:a-zA-Z 匹配所有的大写和小写字母。 联合: 由多个嵌套的character classes组成,匹配属于联合结果的所有字符。例如:a-dm-p 匹配字符a到d和m到p。 characters a through d and m through p。以下的命令行提供了另外一个示例:java RegexDemo abc-e abcdefjava RegexDemo abc-e abcdef 匹配它们在abcdef中的副本 a, b, c, d, and e。没有其它的匹配存在。 交集: 由所有嵌
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则表达式简化模式匹配的代码 精品资料 正则 表达式 简化 模式 匹配 代码 精品 资料

限制150内