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

java.util.regex.*; com.bruceeckel.simpletest.*; java.util.*; SplitDemo { Test monitor = Test(); main(String[] args) { String input = ; System.out.println(Arrays.asList( Pattern.compile().split(input))); System.out.println(Arrays.asList( Pattern.compile().split(input, 3))); System.out.println(Arrays.asList( .split())); monitor.expect( String[] { , , }); } }

第二个split( )会限定支解的次数。

正则表达式是如此重要,以至于有些成果被加进了String类,个中包罗split( )(已经看到了),matches( ),replaceFirst( )以及replaceAll( )。这些要领的成果同Pattern和Matcher的沟通。

替换操纵

正则表达式在替换文本方面出格在行。下面就是一些要领:

replaceFirst(String replacement)将字符串里,第一个与模式相匹配的子串替换成replacement。

replaceAll(String replacement),将输入字符串里所有与模式相匹配的子串全部替换成replacement。

appendReplacement(StringBuffer sbuf, String replacement)对sbuf举办逐次替换,而不是像replaceFirst( )或replaceAll( )那样,只替换第一个或全部子串。这是个很是重要的要领,因为它可以挪用要领来生成replacement(replaceFirst( )和replaceAll( )只答允用牢靠的字符串来充当replacement)。有了这个要领,你就可以编程区分group,从而实现更强大的替换成果。

挪用完appendReplacement( )之后,为了把剩余的字符串拷贝归去,必需挪用appendTail(StringBuffer sbuf, String replacement)。

下面我们来演示一下奈何利用这些替换要领。说明一下,这段措施所处理惩罚的字符串是它本身开头部门的注释,是用正则表达式提取出来并加以处理惩罚之后再传给替换要领的。

java.util.regex.*; java.io.*; com.bruceeckel.util.*; com.bruceeckel.simpletest.*; TheReplacements { Test monitor = Test(); main(String[] args) Exception { String s = TextFile.read(); Matcher mInput = Pattern.compile(, Pattern.DOTALL) .matcher(s); (mInput.find()) s = mInput.group(1); s = s.replaceAll(, ); s = s.replaceAll(, ); System.out.println(s); s = s.replaceFirst(, ); StringBuffer sbuf = StringBuffer(); Pattern p = Pattern.compile(); Matcher m = p.matcher(s); (m.find()) m.appendReplacement(sbuf, m.group().toUpperCase()); m.appendTail(sbuf); System.out.println(sbuf); monitor.expect( String[]{ , , , , , , , , , }); } }

用TextFile.read( )要领来打开和读取文件。mInput的成果是匹配'/*!' 和 '!*/' 之间的文本(留意一下分组用的括号)。接下来,我们将所有两个以上的持续空格全都替换成一个,而且将各行开头的空格全都去掉(为了让这个正则表达式能对所有的行,而不只仅是第一行起浸染,必需启用多行模式)。这两个操纵都用了String的replaceAll( )(这里用它更利便)。留意,由于每个替换只做一次,因此除了预编译Pattern之外,措施没有特另外开销。

replaceFirst( )只替换第一个子串。另外,replaceFirst( )和replaceAll( )只能用常量(literal)来替换,所以假如每次替换的时候还要举办一些操纵的话,它们是无能为力的。遇到这种环境,得用appendReplacement( ),它能在举办替换的时候想写几多代码就写几多。在上面那段措施里,建设sbuf的进程就是选group做处理惩罚,也就是用正则表达式把元音字母找出来,然后换成大写的进程。凡是你得在完玉成部的替换之后才挪用appendTail( ),可是假如要仿照replaceFirst( )(或"replace n")的结果,你也可以只替换一次就挪用appendTail( )。它会把剩下的对象全都放进sbuf。

你还可以在appendReplacement( )的replacement参数里用"$g"引用已捕捉的group,个中'g' 暗示group的号码。不外这是为一些较量简朴的操纵筹备的,因而其结果无法与上述措施对比。

reset( )

另外,还可以用reset( )要领给现有的Matcher工具配上个新的CharSequence。

java.util.regex.*; java.io.*; com.bruceeckel.simpletest.*; Resetting { Test monitor = Test(); main(String[] args) Exception { Matcher m = Pattern.compile() .matcher(); (m.find()) System.out.println(m.group()); m.reset(); (m.find()) System.out.println(m.group()); monitor.expect( String[]{ , , , , , }); } }

假如不给参数,reset( )会把Matcher设到当前字符串的开始处。

假如你曾经用过Perl或任何其他内建正则表达式支持的语言,你必然知道用正则表达式处理惩罚文本和匹配模式是何等简朴。假如你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符组成的串,它界说了一个用来搜索匹配字符串的模式。

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

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