JAVA 正则表达式陈广佳版本(超具体)

  可大致预计一下,除了偶然用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();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdxpw.html