java正则表达式详解

上传人:ta****u 文档编号:187724471 上传时间:2023-02-16 格式:DOCX 页数:12 大小:162.57KB
收藏 版权申诉 举报 下载
java正则表达式详解_第1页
第1页 / 共12页
java正则表达式详解_第2页
第2页 / 共12页
java正则表达式详解_第3页
第3页 / 共12页
资源描述:

《java正则表达式详解》由会员分享,可在线阅读,更多相关《java正则表达式详解(12页珍藏版)》请在装配图网上搜索。

1、Java 正则表达式详解如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简 单。如果你不熟悉这个术语,那么正则表达式(Regular Expression)就是一个字符构成的串,它定义了一个用来搜 索匹配字符串的模式。许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则 表达式实现高级“搜索-替换”功能。那么 Java 又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的 Java 规范需求(Specification Request)已经得到认可,你可

2、以期待在JDK的下一版本中看到它。然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从Apache.org下载源代码开放的Jakarta-ORO库。 本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API为例介绍如何使用正则表达式。一、正则表达式基础知识我们先从简单的开始。假设你要搜索一个包含字符“cat ”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写 不敏感,单词catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说:迁则表达式:c:a-t匹0己:I. Ca+kisr ins, .oph ist1.1

3、 句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t ”字母开头,以“n”字母结束。另外,假设 有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符句 点符号。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“tn”,还有其他许 多无意义的组合。这是因为句点符号匹配所有字符,包括空格、 Tab 字符甚至换行符:正则我达式:-t-n匹酿: 七mn Ten -tin,七口口 七 n tpn r 等1.2 方括号符号为了解决句点符号匹配范围过于广泛这一问题,

4、你可以在方括号(“”)里面指定看来有意义的字符。此时,只有方括 号里面指定的字符才参与匹配。也就是说,正则表达式“taeion”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配, 因为在方括号之内你只能匹配单个字符:迁则表这式:丈Lae i n 匹虹 tan I Ten t i n ton1.3 “或”符号如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“I”操作符。“|”操作符的基本意义就是“或” 运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里 必须使用圆括号

5、“()”。圆括号还可以用来分组,具体请参见后面介绍。亡则表达盘;t i a; i | i cq) n匹配: :-=iri , Te=i. 七in 土叮口. toon1.4 表示匹配次数的符号表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数1表I,表示次数的符号符号次憩*十1致或者務粗1?11屜诸1衣:对曾好u次仙假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是 999-99-9999。用来匹配它的正则表达式如图 一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从 0到9。因此,匹配社会安全号 码中的连字符号时,它的前面要加上

6、一个转义字符“”。连字符连字符0-93 - 0-92 V 0-94前三个数宇中间两个数字最后四个数宇图一:匹配所有 123-12-1234 形式的社会安全号码假设进行搜索的时候,你希望连字符号可以出现,也可以不出现即,999-99-9999 和999999999都属于正确的格 式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:可选的连字符可选的连字符0-93 V? 0-92 V? 0-94前三个数宇中间两个数字最后四个数字图二:匹配所有123-12-1234和 123121234 形式的社会安全号码 下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的

7、正则表达式前面是数字部分 “0-94”,再加上字母部分“A-Z2”。图三显示了完整的正则表达式。0-94 A-Z2前四个频字后两个字母图三:匹配典型的美国汽车牌照号码,如 8836KV1.5 “否”符号Fx“A”符号称为“否”符号。如果用在方括号内,“A”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X” 字母开头的单词除外。a+后维字符可以是aShZ 间的任意字母图四:匹配所有单词,但“X”开头的除外1.6 圆括号和空白符号假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示: +月份值,至少一个宇符必需的空格必需

8、的逗号s+ 0-91s2 ? s* 0-94月份彰澤至多两可选的空格图五:匹配所有Moth DD,YYYY格式的日期新出现的“s ”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份 部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API (本文后面详细讨论)提取出它的值。修改后 的正则表达式如图六所示:必需的空格必需的這号年份恒(a-z+) s+ 0-91,2 , s* 0-94翟嗥月份内即諜至劣两可选的空格图六:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组1.7 其它符号为简便起见,你可以使用一些为常见正则表达式

9、创建的快捷符号。如表二所示:表二:常用符号战慕:常用符号.持号等松的正则表达式P-5呼A-Z0-9PA-20-9t-nW1例如,在前面社会安全号码的例子中,所有出现“0-9”的地方我们都可以使用“d”。修改后的正则表达式如图七所示:连宇符连宇符d3 - d2 - d4前三个数字中间两个数宇 最后四个魏字图七:匹配所有 123-12-1234 格式的社会安全号码二、Jakarta-0R0 库有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl 5兼容的正则表达式语法。我 在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Pe

10、rl 5正则表达式完全兼 容。另外,它也是优化得最好的 API 之一。Jakarta-ORO库以前叫做OROMatcher, Daniel Savarese大方地把它赠送给了 Jakarta Project。你可以按照本文最 后参考资源的说明下载它。我首先将简要介绍使用 Jakarta-ORO 库时你必须创建和访问的对象,然后介绍如何使用 Jakarta-ORO API。 Patterncompiler 对象首先,创建一个 Perl5Compiler 类的实例,并把它赋值给 Patterncompiler 接口对象Perl5Compiler 是 Patterncompiler 接口的一个实现,

11、允许你把正则表达式编译成用来匹配的 Pattern 对象。Pa+ter nComp i I comp i | e rnew Pe r I 5Comp: I er C); Pattern 对象要把正则表达式编译成Pattern对象,调用compiler对象的compile。方法,并在调用参数中指定正则表达式。例如, 你可以按照下面这种方式编译正则表达式“taeion”:默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到的模式只匹配“tin”、“tan”、“ten” 和“ton”,但不匹配“Tin”和“taN”。要创建一个大小写不敏感的模式,你应该在调用编译器的时

12、候指定一个额外的参数:pa+te rrcoinp i I ef . oomp i I e t t ae:i;o.!n , Per I 5Comp i I e K-. C血EENSEMS I TI;创建好 Pattern 对象之后,你就可以通过 PatternMatcher 类用该 Pattern 对象进行模式匹配。 PatternMatcher 对象PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现,它根据Per

13、l 5正则表达式语法进行模式匹配:PatternMatcher matcher = nYY Perl SWatcher C):使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹 配的字符串: boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。换句话说,正则表 达式必须完整地描述输入字符串。 boolean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。 boo

14、lean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一 个子串)。另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;这时,你可以从字 符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcher In put对象作为参数就很有用了。用PatternMatcher Inp ut对象作为参数替代String时,上述三个方法 的语法如下: boolean matches(PatternMat

15、cherInput input, Pattern pattern) boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) boolean contains(PatternMatcherInput input, Pattern pattern)三、应用实例下面我们来看看Jakarta-ORO库的一些应用实例。3.1 日志文件处理任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下:172.56.155.41 - - 26/Feb/2001-1

16、0:56:03: -0500GET /l.sAI jxre.k-tm HTTP/1 200 15 分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项: IP 地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出 IP 地址和时间标记。首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式:必需的旬点必需的旬点必需的旬点d1,3 第1字节1到3个数宇WL3第4字节1到3个数宇d1,3 . d1,3第2字节第3字节1到站数宇1到3个数字图

17、八:匹配 IP 地址IP地址中的句点字符必须进行转义处理(前面加上”),因为IP地址中的句点具有它本来的含义,而不是采用正则表 达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“”),提取出所有不超过结束方括号字符(“”)的内容,向前寻找直至找到结束方括号字符。图九显示了这部分 的正则表达式。开贻符号结束厂符号 J +表达式的一部分,匹配前的所有宇符图九:匹配至少一个字符,直至找到“”现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记

18、录提取出IP地址和 时间。注意,为了匹配“-”(但不提取它),正则表达式中间加入了“s-s-s”。完整的正则表达式如图十所示。必需的连字符(d13Ad1,3Ad1,3.d1?3) s-s-s (A+)圧地址,组1时间值,组2图十:匹配IP地址和时间标记现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。为使用 Jakarta-ORO 库,首先创建正则表达式字符串和待分析的日志记录字符串:5tr irgregp=C0-9 10-9 1.31X. 0-9 Il0-9J(1.313Str irg IogEntry=172.26.155.241 - - 26/Feb/2aO1:

19、10:56:03 -0500GET /IsAIive.htm HTTP/1.0 200 15这里使用的正则表达式与图十的正则表达式差不多完全相同,但有一点例外:在Java中,你必须对每一个向前的斜杠 (“”)进行转义处理。图十不是Java的表示形式,所以我们要在每个“”前面加上一个“”以免出现编译错误。遗憾的是, 转义处理过程很容易出现错误,所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式,然后从左到右依次 把每一个“”替换成“”。如果要复检,你可以试着把它输出到屏幕上。初始化字符串之后,实例化Patterncompiler对象,用Patterncompiler编译正则表达式创建一个P

20、attern对象:PatternCompi I er compi ler=n皂w Per I5Comp i ler();Pat-trn p=ittern=Gflmpi ler 口口mp i IeCrgeKp1 ;现在,创建PatternMatcher对象,调用PatternMatcher接口的contain()方法检查匹配情况:Pat tsrn Mate hs r m-3tc=h rPr I 5 Mate her 0 :i f Cm atch e r . Gon+a ins Clog Eiy. patt ern) M 3*tch Re-ij I r 色:su I +=iTi.atch& r .

21、Mate h 0 :System口utintIn(1P; +resu H.group(1);Sys+ffi .out .pr irt I n CTi尬色兰土吕“口: ssuI + .gr c.upC23):接下来,利用 PatternMatcher 接口返回的 MatchResult 对象,输出匹配的组。由于 logEntry 字符串包含匹配的内容, 你可以看到类如下面的输出:IP: 172.26.155.241Timestamp: 26/Fet/2001:10:56:03 -05003.2 HTML 处理实例一下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FON

22、T标记如下所示:程序将按照如下形式,输出每一个FONT标记的属性:face=Ar il, 5ar ifs icolor=red在这种情况下,我建议你使用两个正则表达式。第一个如图一所示,它从字体标记提取出“ face=Arial, Serifsize=+2 color=red”。可选的空白宇符可迭的空白字符可选的空白字符D E p孚符标记的名宇匹配之前的所有字符,o字符定丈为组1图十一:匹配 FONT 标记的所有属性第二个正则表达式如图十二所示,它把各个属性分割成名字-值对。(词+)属性名孚,组1 H开姑引号字符(n+)结東别号字符匹配除结束引号宇符外的所有可选的空白孚符可选的空白字符字符,组

23、2图十二:匹配单个属性,并把它分割成名字-值对分割结果为:+=ice Ar i =i I , Ser i + s ize +2u口lor red现在我们来看看完成这个任务的 Java 代码。首先创建两个正则表达式字符串,用 Perl5Compiler 把它们编译成 Pattern 对象。编译正则表达式的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项,使得匹配操作不区分大小写。 接下来,创建一个执行匹配操作的 Perl5Matcher 对象。Str.i ng r egeMpForFontlE0cnte+ (*工堆訐工:S-tr i ng f ewESKpFc

24、jfFqn:血七打 ap丄).话*=讣話、,【 4) ;PatternCompi I tompi ler=riew Pe r I SComp i I er 0 :Pattei-n ptte rnFoi-F口ntTm=gmp i I er . cppp i I e ( regexpFor FqntTag, Per I SGompi lar. C;嘘ENSEN3 I Tl VE_MASK);Pa-t-te mpatter nFor FontAttr i b-pomp i I e r, .po mp i I e (regeKpForFcirTtAtt r, i b , Per ISCompi I e

25、r. UA 託N8EN3 LT I VE_MASK);PatternMatcher matchar=new- Per ISMatcher.O ;假设有一个String类型的变量html,它代表了 HTML文件中的一行内容。如果html字符串包含FONT标记,匹配器 将返回true。此时,你可以用匹配器对象返回的MatchResult对象获得第一个组,它包含了 FONT的所有属性:i + (rnatch&K . i ns (htm I. pa-tter nFor FcntTg) ) MatchResuIt resuIt-matcher.gelMatchQ ;Str ing -ttr ibs-re

26、su 11 g:rcup(1?:PatternNatcherInput input=new PatternNatcherInputtttr ibs): :while (instoPiSK . oonts i ns-t i nput patterriForFontAt-tF i r wwrj Ihe r 护七MpPuh 0.;System. out. pr i nt InCresul t. group CO+ :+rasu I 七.group ;.1接下来创建一个 PatternMatcherInput 对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作,因此,它 很适合于提取FONT

27、标记内属性的名字-值对。创建PatternMatcherInput对象,以参数形式传入待匹配的字符串。然 后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象(而不是字符串对象)为参数, 反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指 针向前移动,下一次检测将从前一次匹配位置的后面开始。本例的输出结果如下:3.3 HTML 处理实例二下面我们来看看另一个处理 HTML 的例子。这一次,我们假定 Web 服务器从 移到了。现在你要修改一些页面中的链接:域

28、:a hrht+p : /w i idee-ts . ac=rrie . com/1 n+erface . h+m ITo.Ehy m hre_f= http: /ne vyse rr . a cme. cnm/ i rte r fane . htm I rlsvr_TQ_Se I I 执行这个搜索的正则表达式如图十三所示:霧的缥的霧的霧的必需的字符序列引号字符 子符的所有内容,组1图十三:匹配修改前的链接如果能够匹配这个正则表达式,你可以用下面的内容替换图十三的链接:注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有 作为一个组匹

29、配和提取出来的内容附加到链接的后面。现在,返回Java。就象前面我们所做的那样,你必须创建测试字符串,创建把正则表达式编译到Pattern对象所必需 的对象,以及创建一个PatternMatcher对象:Str- i ng I i nkm Q href= V http : f. fwi dgets . acme . com/ i nterface . htm I #How_To_Trade. 后Str i ngregexpForL i nk= Xs*as+h r efs*=s*http:/w i dge+ n+erface.htmI#(闪FatternCompi I er compi ler=

30、new Per I SComp i I er 0 ;Pattern pa+ternForLink=compiI piIe(regexpForLink.Per 15Compi ler.CASE_INSENSITIVEJ.1ASK);Pa+ternMa+cher matcher=new Per ISMa+cher 0;接下来,用com. oroi nc. text .regex包Util类的substitute。静态方法进行替换,输出结果字符串:Str i ng resul t=Ut i I . subst i tuts (matcher .patternForLi nkBnew Fsr I SS

31、ubst i tut i on (Ka hre+ = h+tp : /n&Yisar ver . acne . com/ i rrte r -face . h七m 丨 1 H.) I i nk,U-ti ,SUBS7ITUTE_ALL):SysteiTi .out. pr intln (resLi 11);Util.substitute()方法的语法如下:pub I i ci e -tr i.ng ubs-t il卩耳七七fnMm-tuhmr ma-tche rPattern pattern,Sub i u-t i on sub ,Str irg i nput,i nt numSubs?这个调

32、用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象,它决定了 替换操作如何进行。本例使用的是Perl5Substitution对象,它能够进行Perl5风格的替换。第四个参数是想要进行替 换操作的字符串,最后一个参数允许指定是否替换模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替换指定的 次数。【结束语】在这篇文章中,我为你介绍了正则表达式的强大功能。只要正确运用,正则表达式能够在字符串提取和文 本修改中起到很大的作用。另外,我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采 用老式的字符串处理方式(使用StringTokenizer, charAt,和substring),还是采用正则表达式,这就有待你自己决 定了。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!