java正则表达式彻底研究 (六)

2014-11-24 08:07:39 · 作者: · 浏览: 4
ldoo\nhello,loveroo");
System.out.println(m14.find());
System.out.println("start:"+m14.start()+"end:"+m14.end());
System.out.println(m14.find());
//System.out.println("start:"+m14.start()+"end:"+m14.end());
System.out.println("test MULTILINE");
Pattern p15=Pattern.compile("^hell(.|[^.])*oo$");
Matcher m15=p15.matcher("hello,Worldoo\nhello,loveroo");
System.out.println(m15.find());
System.out.println("start:"+m15.start()+"end:"+m15.end());
System.out.println(m15.find());
// System.out.println("start:"+m15.start()+"end:"+m15.end());

//test DOTALL
System.out.println("test DOTALL");
Pattern p16=Pattern.compile(".",Pattern.DOTALL);
Matcher m16=p16.matcher("\n\r");
System.out.println(m16.find());
System.out.println(m16.find());

System.out.println("test DOTALL");
Pattern p17=Pattern.compile(".");
Matcher m17=p17.matcher("\n\r");
System.out.println(m17.find());
System.out.println(m17.find());

System.out.println("test DOTALL");
Pattern p18=Pattern.compile("( s).");
Matcher m18=p18.matcher("\n\r");
System.out.println(m18.find());
System.out.println(m18.find());

//test CANON_EQ这个是jdk的例子但我实在不明白是什么意思,向大家请教
System.out.println("test CANON_EQ");
Pattern p19=Pattern.compile("a\u030A",Pattern.CANON_EQ);
System.out.println(Character.getType('\u030A'));
System.out.println("is"+Character.isISOControl('\u030A'));
System.out.println("is"+Character.isUnicodeIdentifierPart('\u030A'));
System.out.println(Character.getType('\u00E5'));
System.out.println("is"+Character.isISOControl('\u00E5'));
Matcher m19=p19.matcher("\u00E5");
System.out.println(m19.matches());
System.out.println(Character.getType('\u0085'));
System.out.println("is"+Character.isISOControl('\u0085'));

//注意下面三个例子体会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.ou