马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是我同意你的观点,对于大型项目来说,应该是采用框架的一部分,根据功能的不同而改进,欢迎你能再提出些宝贵意见,我会多多学习的。说到jbuilder,我可能是个人感觉,用的时候确实没有vs爽,我最喜欢的IDE是netbeans,谢谢。详解|正则假如你已经用过Perl或任何其他内建正则表达式撑持的言语,你必定晓得用正则表达式处置文本和婚配形式是何等复杂。假如你不熟习这个术语,那末“正则表达式”(RegularExpression)就是一个字符组成的串,它界说了一个用来搜刮婚配字符串的形式。很多言语,包含Perl、PHP、Python、JavaScript和JScript,都撑持用正则表达式处置文本,一些文本编纂器用正则表达式完成初级“搜刮-交换”功效。那末Java又如何呢?本文写作时,一个包括了用正则表达式举行文本处置的Java标准需求(SpecificationRequest)已失掉承认,你能够等候在JDK的下一版本中看到它。但是,假如如今就必要利用正则表达式,又该怎样办呢?你能够从Apache.org下载源代码开放的Jakarta-ORO库。本文接上去的内容先扼要地先容正则表达式的进门常识,然后以Jakarta-OROAPI为例先容怎样利用正则表达式。1、正则表达式基本常识我们先从复杂的入手下手。假定你要搜刮一个包括字符“cat”的字符串,搜刮用的正则表达式就是“cat”。假如搜刮对巨细写不敏感,单词“catalog”、“Catherine”、“sophisticated”都能够婚配。也就是说:
<br>1.1句点标记假定你在玩英文拼字游戏,想要找出三个字母的单词,并且这些单词必需以“t”字母开首,以“n”字母停止。别的,假定有一本英笔墨典,你能够用正则表达式搜刮它的全体内容。要机关出这个正则表达式,你可使用一个通配符――句点标记“.”。如许,完全的表达式就是“t.n”,它婚配“tan”、“ten”、“tin”和“ton”,还婚配“t#n”、“tpn”乃至“tn”,另有其他很多偶然义的组合。这是由于句点标记婚配一切字符,包含空格、Tab字符乃至换行符:
<br>1.2方括号标记为懂得决句点标记婚配局限过于普遍这一成绩,你能够在方括号(“[]”)内里指定看来成心义的字符。此时,只要方括号内里指定的字符才介入婚配。也就是说,正则表达式“t[aeio]n”只婚配“tan”、“Ten”、“tin”和“ton”。但“Toon”不婚配,由于在方括号以内你只能婚配单个字符:
<br>1.3“或”标记假如除下面婚配的一切单词以外,你还想要婚配“toon”,那末,你可使用“|”操纵符。“|”操纵符的基础意义就是“或”运算。要婚配“toon”,利用“t(a|e|i|o|oo)n”正则表达式。这里不克不及利用方扩号,由于方括号只同意婚配单个字符;这里必需利用圆括号“()”。圆括号还能够用来分组,详细请拜见前面先容。
<br>1.4暗示婚配次数的标记表一显现了暗示婚配次数的标记,这些标记用来断定紧靠该标记右边的标记呈现的次数:
假定我们要在文本文件中搜刮美国的社会平安号码。这个号码的格局是999-99-9999。用来婚配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特别的意义,它暗示一个局限,好比从0到9。因而,婚配社会平安号码中的连字标记时,它的后面要加上一个本义字符“”。
图一:婚配一切123-12-1234情势的社会平安号码
假定举行搜刮的时分,你但愿连字标记能够呈现,也能够不呈现――即,999-99-9999和999999999都属于准确的格局。这时候,你能够在连字标记前面加上“?”数目限制标记,如图二所示:
图二:婚配一切123-12-1234和123121234情势的社会平安号码
上面我们再来看别的一个例子。美国汽车派司的一种格局是四个数字加上二个字母。它的正则表达式后面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显现了完全的正则表达式。
图三:婚配典范的美国汽车派司号码,如8836KV
1.5“否”标记“^”标记称为“否”标记。假如用在方括号内,“^”暗示不想要婚配的字符。比方,图四的正则表达式婚配一切单词,但以“X”字母开首的单词除外。
图四:婚配一切单词,但“X”开首的除外
1.6圆括号和空缺标记假定要从格局为“June26,1951”的诞辰日期中提掏出月份部分,用来婚配该日期的正则表达式能够如图五所示:
图五:婚配一切MothDD,YYYY格局的日期
新呈现的“s”标记是空缺标记,婚配一切的空缺字符,包含Tab字符。假如字符串准确婚配,接上去怎样提掏出月份部分呢?只需在月份四周加上一个圆括号创立一个组,然后用OROAPI(本文前面具体会商)提掏出它的值。修正后的正则表达式如图六所示:
图六:婚配一切MonthDD,YYYY格局的日期,界说月份值为第一个组
1.7别的标记为烦琐起见,你可使用一些为罕见正则表达式创立的快速标记。如表二所示:表二:经常使用标记
比方,在后面社会平安号码的例子中,一切呈现“[0-9]”的中央我们都可使用“d”。修正后的正则表达式如图七所示:
图七:婚配一切123-12-1234格局的社会平安号码
2、Jakarta-ORO库有很多源代码开放的正则表达式库可供Java程序员利用,并且它们中的很多撑持Perl5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库,它是最周全的正则表达式API之一,并且它与Perl5正则表达式完整兼容。别的,它也是优化得最好的API之一。Jakarta-ORO库之前叫做OROMatcher,DanielSavarese小气地把它赠予给了JakartaProject。你能够依照本文最初参考资本的申明下载它。我起首将扼要先容利用Jakarta-ORO库时你必需创立和会见的对象,然后先容怎样利用Jakarta-OROAPI。▲PatternCompiler对象起首,创立一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个完成,同意你把正则表达式编译成用来婚配的Pattern对象。
<br>▲Pattern对象要把正则表达式编译成Pattern对象,挪用compiler对象的compile()办法,并在挪用参数中指定正则表达式。比方,你能够依照上面这类体例编译正则表达式“t[aeio]n”:
<br>默许情形下,编译器创立一个巨细写敏感的形式(pattern)。因而,下面代码编译失掉的形式只婚配“tin”、“tan”、“ten”和“ton”,但不婚配“Tin”和“taN”。要创立一个巨细写不敏感的形式,你应当在挪用编译器的时分指定一个分外的参数:
<br>创立好Pattern对象以后,你就能够经由过程PatternMatcher类用该Pattern对象举行形式婚配。▲PatternMatcher对象PatternMatcher对象依据Pattern对象和字符串举行婚配反省。你要实例化一个Perl5Matcher类并把了局赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个完成,它依据Perl5正则表达式语法举行形式婚配:
<br>利用PatternMatcher对象,你能够用多个办法举行婚配操纵,这些办法的第一个参数都是必要依据正则表达式举行婚配的字符串:・booleanmatches(Stringinput,Patternpattern):当输出字符串和正则表达式要准确婚配时利用。换句话说,正则表达式必需完全地形貌输出字符串。・booleanmatchesPrefix(Stringinput,Patternpattern):当正则表达式婚配输出字符串肇端部分时利用。・booleancontains(Stringinput,Patternpattern):当正则表达式要婚配输出字符串的一部分时利用(即,它必需是一个子串)。别的,在下面三个办法挪用中,你还能够用PatternMatcherInput对象作为参数替换String对象;这时候,你能够从字符串中最初一次婚配的地位入手下手持续举行婚配。当字符串大概有多个子串婚配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有效了。用PatternMatcherInput对象作为参数替换String时,上述三个办法的语法以下:・booleanmatches(PatternMatcherInputinput,Patternpattern)・booleanmatchesPrefix(PatternMatcherInputinput,Patternpattern)・booleancontains(PatternMatcherInputinput,Patternpattern)3、使用实例上面我们来看看Jakarta-ORO库的一些使用实例。3.1日记文件处置义务:剖析一个Web服务器日记文件,断定每个用户花在网站上的工夫。在典范的BEAWebLogic日记文件中,日记纪录的格局以下:
<br>剖析这个日记纪录,能够发明,要从这个日记文件提取的内容有两项:IP地点和页面会见工夫。你能够用分组标记(圆括号)从日记纪录提掏出IP地点和工夫标志。起首我们来看看IP地点。IP地点有4个字节组成,每个字节的值在0到255之间,各个字节经由过程一个句点分开。因而,IP地点中的每个字节有最少一个、最多三个数字。图八显现了为IP地点编写的正则表达式:
图八:婚配IP地点
IP地点中的句点字符必需举行本义处置(后面加上“”),由于IP地点中的句点具有它原本的寄义,而不是接纳正则表达式语法中的特别寄义。句点在正则表达式中的特别寄义本文后面已先容。日记纪录的工夫部分由一对方括号包抄。你能够依照以下思绪提掏出方括号内里的一切内容:起首搜刮肇端方括号字符(“[”),提掏出一切不凌驾停止方括号字符(“]”)的内容,向前寻觅直至找到停止方括号字符。图九显现了这部分的正则表达式。
图九:婚配最少一个字符,直至找到“]”
如今,把上述两个正则表达式加上分组标记(圆括号)后兼并成单个表达式,如许就能够从日记纪录提掏出IP地点和工夫。注重,为了婚配“--”(但不提取它),正则表达式两头到场了“s-s-s”。完全的正则表达式如图十所示。
图十:婚配IP地点和工夫标志
如今正则表达式已编写终了,接上去能够编写利用正则表达式库的Java代码了。为利用Jakarta-ORO库,起首创立正则表达式字符串和待剖析的日记纪录字符串:
<br>这里利用的正则表达式与图十的正则表达式差未几完整不异,但有一点破例:在Java中,你必需对每个向前的斜杠(“”)举行本义处置。图十不是Java的暗示情势,以是我们要在每一个“”后面加上一个“”以避免呈现编译毛病。遗憾的是,本义处置历程很简单呈现毛病,以是应当胆小如鼠。你能够起首输出未经本义处置的正则表达式,然后从左到右顺次把每个“”交换成“”。假如要复检,你能够试着把它输入到屏幕上。初始化字符串以后,实例化PatternCompiler对象,用PatternCompiler编译正则表达式创立一个Pattern对象:
<br>如今,创立PatternMatcher对象,挪用PatternMatcher接口的contain()办法反省婚配情形:
<br>接上去,使用PatternMatcher接口前往的MatchResult对象,输入婚配的组。因为logEntry字符串包括婚配的内容,你能够看到类以下面的输入:
<br>3.2HTML处置实例一上面一个义务是剖析HTML页面内FONT标志的一切属性。HTML页面内典范的FONT标志以下所示:
<br>程序将依照以下情势,输入每个FONT标志的属性:
<br>在这类情形下,我倡议你利用两个正则表达式。第一个如图十一所示,它从字体标志提掏出“"face="Arial,Serif"size="+2"color="red"”。
图十一:婚配FONT标志的一切属性
第二个正则表达式如图十二所示,它把各个属性支解成名字-值对。
图十二:婚配单个属性,并把它支解成名字-值对
支解了局为:
<br>如今我们来看看完成这个义务的Java代码。起首创立两个正则表达式字符串,用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时分,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项,使得婚配操纵不辨别巨细写。接上去,创立一个实行婚配操纵的Perl5Matcher对象。
<br>假定有一个String范例的变量html,它代表了HTML文件中的一行内容。假如html字符串包括FONT标志,婚配器将前往true。此时,你能够用婚配器对象前往的MatchResult对象取得第一个组,它包括了FONT的一切属性:
<br>接上去创立一个PatternMatcherInput对象。这个对象同意你从最初一次婚配的地位入手下手持续举行婚配操纵,因而,它很合适于提取FONT标志内属性的名字-值对。创立PatternMatcherInput对象,以参数情势传进待婚配的字符串。然后,用婚配器实例提掏出每个FONT的属性。这经由过程指定PatternMatcherInput对象(而不是字符串对象)为参数,重复地挪用PatternMatcher对象的contains()办法完成。PatternMatcherInput对象当中的每次迭代将把它外部的指针向前挪动,下一次检测将夙昔一次婚配地位的前面入手下手。本例的输入了局以下:
<br>3.3HTML处置实例二上面我们来看看另外一个处置HTML的例子。这一次,我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。如今你要修正一些页面中的链接:
<br>实行这个搜刮的正则表达式如图十三所示:
图十三:婚配修正前的链接
假如可以婚配这个正则表达式,你能够用上面的内容交换图十三的链接:
<br>注重#字符的前面加上了$1。Perl正则表达式语法用$1、$2等暗示已婚配且提掏出来的组。图十三的表达式把一切作为一个组婚配和提掏出来的内容附加到链接的前面。如今,前往Java。就象后面我们所做的那样,你必需创立测试字符串,创立把正则表达式编译到Pattern对象所必须的对象,和创立一个PatternMatcher对象:
<br>接上去,用com.oroinc.text.regex包Util类的substitute()静态办法举行交换,输入了局字符串:
<br>Util.substitute()办法的语法以下:
<br>这个挪用的前两个参数是之前创立的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象,它决意了交换操纵怎样举行。本例利用的是Perl5Substitution对象,它可以举行Perl5作风的交换。第四个参数是想要举行交换操纵的字符串,最初一个参数同意指定是不是交换形式的一切婚配子串(Util.SUBSTITUTE_ALL),或只交换指定的次数。【停止语】在这篇文章中,我为你先容了正则表达式的壮大功效。只需准确使用,正则表达式可以在字符串提取和文本修正中起到很年夜的感化。别的,我还先容了怎样在Java程序中经由过程Jakarta-ORO库使用正则表达式。至于终极接纳老式的字符串处置体例(利用StringTokenizer,charAt,和substring),仍是接纳正则表达式,这就有待你本人决意了。
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 |