首页 » 精通正则表达式(第3版) » 精通正则表达式(第3版)全文在线阅读

《精通正则表达式(第3版)》Pattern的其他方法

关灯直达底部

Other Pattern Methods

除了主要的compile factories,Pattern类还提供了一些辅助方法:

split

下一页会详细讲解两种形式的split方法。

String pattern

这个方法返回用于创建本pattern的正则表达式字符串。

String toString

这个方法从Java 1.5之后可用,等价于pattern方法。

int flags

这个方法返回pattern创建时传递给compile factory的flag参数(作为整数)。

static String quote(String text)

从 Java 1.5 开始提供的 static 方法,返回 text 对应的正则文字字符串,能够作为Pattern.compile 的参数。例如,Pattern.quote("main()")返回字符串‘Qmain ()E’,作为正则表达式它解释为「Qmain()E」,完全能够匹配原始的参数‘main()’。

static boolean matches(String regex,CharSequence text)

这个static方法返回的Boolean值表示正则表达式能否匹配文本(与matcher方法的参数一样,可以是一个String或者任何实现CharSequence的对象☞373)。其实,它等价于:

Pattern.compile(regex).matcher(text).matches;

如果需要传递编译参数,或者所要的信息不只是简单的匹配是否成功,则应该使用之前介绍的办法。

如果这个方法需要多次调用(例如,在循环中,或者其他经常调用的代码中),预先把正则表达式编译为一个Pattern对象,然后每次应用的效率会高很多。

Pattern的split方法,单个参数

Patter n/'s split Method,with One Argument

String split(CharSequence text)

pattern的这个方法接收文本(一个CharSequence对象),然后返回一个数组,包含由这个pattern对应的正则表达式在其中的匹配分隔的文本。String类的 split方法也提供了同样的功能。

String result=Pattern.compile("//.").split("209.204.146.22");

返回4个字符串构成的数组(‘209’、‘204’、‘146’和‘22’),由文本中的三个「.」分隔。这个简单例子只用单个字符分隔,但其实我们可以使用任何正则表达式。例如,你可以用非字母和数字的字符把一个字符串粗略地分为“单词”:

String result=Pattern.compile("//W+").split(Text);

如果给出的字符串是,则返回4个字符串(‘what’、‘s’、‘up’、‘Doc’),由这个表达式的 3 次匹配(如果包含非 ASCII 文本,你可能需要使用「P{L}+」或「[^p{L}p{N}_]」而不是「W+」☞367)分隔。

相邻匹配之间的空元素

如果正则表达式能够在文本的最开头匹配,返回数组的第一个元素应该是空字符串(这是一个合法的字符串,但是不包括任何字符)。同样,如果正则表达式能够在某个位置匹配两次以上,应该返回空字符串,因为邻近的匹配“分割”了零长度的文本。例如:

String result=Pattern.compile("//s*,//s*").split(",one,two,,,3");按照两边可能出现空白字符的逗号来分割,返回一个 5 个元素的数组:空字符串、‘one’、‘two’、两个空字符串和‘3’。

序列末尾出现的所有空字符串都会被忽略:

String result=Pattern.compile(":").split(":xx:");

这样会得到两个字符串:一个空字符串和‘xx’。如果希望保留这些元素,请使用下面介绍的双参数版本的split。

Pattern的split方法,两个参数

Pattern/'s split Method,with Two Arguments

String split(CharSequence text,int limit)

这个版本的split方法能够控制pattern应用的次数,以及结尾部分可能出现的空元素的处理策略。String类的split方法也可以获得同样效果。

limit参数等于0,大于0,还是小于0,各有意义。

limit小于0

如果limit小于0,就会保留数组结尾的空元素。

String result=Pattern.compile(":").split(":xx:",-1);

返回包含3个字符串的数组(一个空字符串,‘xx’,然后是另一个空字符串)。

limit等于0

把limit设置为0,等于不设置limit,所以不会保留结尾的空元素。

limit大于0

如果limit大于0,则split返回的数组最多包括limit个元素。也就是说,正则表达式至多会应用limit-1次。(如果limit=3,则需要2次匹配来分割3个字符串)。

进行 limit-1 次匹配之后,匹配停止,目标字符串中其余的部分(在最后一次匹配之后的文本)会作为结果数组的尾元素。

如果某个字符串如下:

Friedl,Jeffrey,Eric Francis,America,Ohio,Rootstown

并且希望得到头三个部分,你可以将字符串分割为4 个部分(头3 个部分是名字,然后是最后的“其他”字符串):

为split设置limit的理由在于,如果不需要更多地处理,它可以用来停止查找其他的字符串、创建新字符串,限制数组的长度,提高效率。提供limit能够限制工作量。