COMMENTS 指定使用注释和忽略空白,也就是".*a"==". *a #this is comments"我想这个 * 在正则表达式很大,而且是在文件中输入时比较有用,平时我看也用不上。 * * MULTILINE In multiline mode the expressions ^ and $ match just after * or just before, respectively, a line terminator or the end of the * input sequence. By default these expressions only match at the beginning * and the end of the entire input sequence * 指定使用多行匹配模式,在默认模式下,^和$分别只匹配一个输入的开始和结束。 * 在这种模式下,^和$ 除了匹配整个输入的开始和结束外还匹配一个line terminator的后边和 * 前边(不是前边和后边,就是说^匹配line terminator的后边$匹配line terminator的前边。 * * DOATALL 如指定了这个模式则"."可匹配任何字符包括line terminator * * UNIX_LINES 指定这个模式时只有\n被认为是line terminator而\r和\r\n都不是 * * 其他的我一时想不起来了,在具体介绍时再说吧。 * /p> */ public class TestReg2 {
//演示appendXXX的用法 System.out.println("=================test append===================="); Pattern p4 = Pattern.compile("cat"); Matcher m4 = p4.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); boolean result = m4.find(); int i=0; System.out.println("one cat two cats in the yard"); while(result) {m4.appendReplacement(sb, "dog"); System.out.println(m4.group()); System.out.println("第"+i+++"次:"+sb.toString()); result = m4.find(); } System.out.println(sb.toString()); m4.appendTail(sb); System.out.println(sb.toString());
//test COMMENTS System.out.println("test COMMENTS"); Pattern p11=Pattern.compile(" a a #ccc",Pattern.COMMENTS); Matcher m11=p11.matcher("aa a a #ccc"); System.out.println(m11.find()); System.out.println(m11.find()); System.out.println("test COMMENTS"); Pattern p12 = Pattern.compile("(?x) a a #ccc"); Matcher m12 = p12.matcher("aa a a #ccc"); System.out.println(m12.find()); System.out.println(m12.find());
//注意下面三个例子体会Greedy,Reluctant and Possessive Quantifiers的不同 Pattern ppp=Pattern.compile(".*foo"); Matcher mmm=ppp.matcher("xfooxxxxxxfoo"); /** * Greedy quantifiers X? X, once or not at all X* X, zero or more times X+ X, one or more times X{n} X, exactly n times X(n,} X, at least n times X{n,m} X, at least n but not more than m times Greedy quantifiers是最常用的一种,如上,它的匹配方式是先匹配尽可能多的字符,当 这样造成整个表达式整体不能匹配时就退一个字符再试比如: .*foo与xfooxxxxxxfoo的匹配过程,.*先与整个输入匹配,发现这样不行,整个串不能匹配 * 于是退最后一个字符"o"再试,还不行,再退直到把foo都退出才发现匹配于是结束。因为这个过程 * 总是先从最大匹配开始到找到一个匹配,所以.*与之匹配的总是一个最大的,这个特点和资本家相似 * 故名贪婪的 */ boolean isEnd=false; int k=0; System.out.println("=========="); System.out.println("xfooxxxxxxfoo"); while(isEnd==false) try{ System.out.println("the:"+k++); System.out.println(mmm.find()); System.out.println(mmm.end()); }catch(Exception e){ isEnd=true; } isEnd=false; Pattern ppp1=Pattern.compile(".*?foo"); Matcher mmm1=ppp1.matcher("xfooxxxxxxfoo"); /** * Reluctant quantifiers X?? X, once or not at all X*? X, zero or more times X+? X, one or more times X{n}? X, exactly n times X(n,}? X, at least n times X{n,m}? X, at least n but not more than m times Reluctant quantifiers的匹配方式正好相反,它总是先从最小匹配开始,如果这时导致 整个串匹配失败则再吃进一个字符再试,如: .*?foo与xfooxxxxxxfoo的匹配过程,首先,.*与空串匹配,这时整个串匹配失败,于是 * 再吃一个x,这时发现整个串匹配成功,当再调用find时从上次匹配结束时开始找,先吃一个 * 空串,不行,再吃一个x,不行,……直到把中间所有x都吃掉才发现匹配成功。这种方式总 * 是从最小匹配开始所以它能找到最多次数的匹配,但第一匹配都是最小的。它的行为有点象雇佣 * 工人,总是尽可能少的于活,故名勉强的。 */ k=0; System.out.println("?????????????????????"); System.out.println("xfooxxxxxxfoo"); while(isEnd==false) try{ System.out.println("the:"+k++); System.out.println(mmm1.find()); System.out.println(mmm1.end()); }catch(Exception e){ isEnd=true; } isEnd=false; Pattern pp2=Pattern.compile(".*+foo"); Matcher mm2=pp2.matcher("xfooxxxxxxfoo"); /** * Possessive quantifiers X?+ X, once or not at all X*+ X, zero or more times X++ X, one or more times X{n}+ X, exactly n times X(n,}+ X, at least n times X{n,m}+ X, at least n but not more than m times Possessive quantifiers 这种匹配方式与Greedy方式相似,所不同的是它不够聪明,当 它一口吃掉所有可以吃的字符时发现不匹配则认为整个串都不匹配,它不会试着吐出几个。它的行 为和大地主相似,贪婪但是愚蠢,所以名曰强占的。 */