对那些熟悉用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包当作是手边必备的利器。
CharSequence
JDK 1.4界说了一个新的接口,叫CharSequence。它提供了String和StringBuffer这两个类的字符序列的抽象:
CharSequence { charAt( i); length(); subSequence( start, end); toString(); }
为了实现这个新的CharSequence接口,String,StringBuffer以及CharBuffer都作了修改。许多正则表达式的操纵都要拿CharSequence作参数。
Pattern和Matcher