java正则表达式中:
已知:
//定义f1("a", "aaa");作用,返回str中找到的符合 正则表达式reg的子串
public static void f1(String reg, String str) {//作用,返回str中找到的符合 正则表达式reg的子串
System.out.print(reg + "\t");
String reg2 = reg;
System.out.print(reg2 + "\t"); Pattern p = Pattern.compile(reg2);
Matcher m = p.matcher(str);
System.out.print(m.matches() + "\t"); Pattern p1 = Pattern.compile(reg2);
Matcher m1 = p.matcher(str);
boolean b;
while (b = m1.find()) {
System.out.print(b + "\t");
if (b) {
System.out.print(m1.group() + "\t");
System.out.print(m1.start() + "\t");
System.out.print(m1.end() + "\t");
}
}
System.out.print("\n");
}
调用f1():
f1("a{1,2}", "aaa");// 
f1("a{1,2}?", "aaa");// 
f1("a{1,2}+", "aaa");//看到的现象(注意调用f1()的时候):
我试验了好几组正则表达式,每组中无论是贪婪量词,的样式懒惰量词,支配量词,使用matches()得到的要么都是true,要么都是FALSE。问题是:1 。既然matcher.matches()函数要求的是“完全匹配”才返回true,那么与  贪婪量词,懒惰量词,支配量词没有关系?
        2 。是不是贪婪量词,懒惰量词,支配量词仅仅与find()的返回值才有关系??
        3.既然贪婪,和懒惰量词 :“贪婪”是从“吞入最多各字符”开始,找不到符合条件情况下,去掉一个字符,在找。。
“懒惰”和贪婪正好相反,只要贪婪量词能找到匹配的,那么懒惰量词不也是也照样能找到吗???4.既然支配量词是“全部匹配才行”
那么  "a{1,2}+"为什么能够从"aaa"中m.find()出来一个"aa"呢????;5. 
高手给我解解围呀!!!

解决方案 »

  1.   

    我只知道在perl上很好使的表达式在java里就问题百出,而且java的正则表达式效率太低
      

  2.   

    1.matcher.matches()完全匹配,没错,和你说的那些量词有关系。
    2.根据1,所以2的答案是:不是。
    3.先弄清你写的那几个表达式的意思吧。
      a{1,2}是说有1-2个a,匹配a,aa。
      a{1,2}?是说有1-2个a,可以出现0-1次。匹配"",aa,a.
      a{1,2}+是说有1-2个a,必须出现1次。匹配aa,a.
    4.见3.
    5.算不算解围?
      

  3.   

    a{1,2}+是说有1-2个a,必须出现1次以上。匹配a,aa,aaa,aaaa,... 
      

  4.   

    试了一下,刚才的回答有错误。
    a{1,2}是说有1-2个a,匹配a,aa,优先匹配aa。所以aaa时,先find一个aa,剩a,也匹配。结果是aa,a。如果是aaaa,那么结果是aa,aa。 
    a{1,2}?是说有1-2个a,可以出现0-1次。匹配aa,a.优先匹配a。所以无论几个a,都是一个个匹配单个a,aaa的结果是a,a,a。aaaa的结果是a,a,a,a。 
    a{1,2}+是说有1-2个a,必须出现1次以上。匹配aa,a. 优先匹配aa。所以aaa的结果是aa,a。aaaa的结果是aa,aa。
      

  5.   

    你这种说法明显不对
    a{1,2}?与a{1,2}和a{1,2}完全是一样的意思,只是在和find配套使用的时候有些差异而已。java中的正则式和linux系统上的不同,不要混为一谈。
    附java api上的说明:Greedy 数量词 
    X? X,一次或一次也没有 
    X* X,零次或多次 
    X+ X,一次或多次 
    X{n} X,恰好 n 次 
    X{n,} X,至少 n 次 
    X{n,m} X,至少 n 次,但是不超过 m 次 
      
    Reluctant 数量词 
    X?? X,一次或一次也没有 
    X*? X,零次或多次 
    X+? X,一次或多次 
    X{n}? X,恰好 n 次 
    X{n,}? X,至少 n 次 
    X{n,m}? X,至少 n 次,但是不超过 m 次 ----根本没有说可以出现0次
      
    Possessive 数量词 
    X?+ X,一次或一次也没有 
    X*+ X,零次或多次 
    X++ X,一次或多次 
    X{n}+ X,恰好 n 次 
    X{n,}+ X,至少 n 次 
    X{n,m}+ X,至少 n 次,但是不超过 m 次 
      

  6.   

    lujinke的关于“a{1,2}?”,“a{1,2}+”中的“?”和“+” 的看法和我的一致:“?”,“+”在java的正则中有两种用法:1.举例:a? 中的?表示的是“0次或1次”。
    2.举例:a{1,2}?中的?表示的是“懒惰模式匹配”
    3.结论:“?”跟在量词?,+,*,{1},{1,},{1,2}之后是“懒惰模式匹配”的意思。跟在非量词(比如"a")之后 是表示0次或者1次。。
      

  7.   

    正则表达式比String类好用多了, 想怎么处理就怎么处理