前几天搞明白了Javascript中的正则表达式(当然,写的水平还是很不咋地),于是想把系统中的java代码中的比较累赘的搜索、替换的代码,用正则表达式替换掉。
没想到java的正则表达式和javascript的应该是相差很大的。
之前的代码中,我只用过String.split("[|]");
根据javaAPI的正则表达式的例子 Pattern p = Pattern.compile("a*b"); //1
Matcher m = p.matcher("aaaaab");
System.out.println(m.matches());结果是:true。但把第1行的“a*b”改为“ab”或者“a”,都会显示false。然后,加上“[]”或者“/”都不对。我就想不明白,"a*b"是正则表达式,怎么"ab"或者"a",就不是正则表达式了呢?split()用的是正则表达式,Pattern.compile()也是用正则表达式,为何写法不一样?应该如何写法?

解决方案 »

  1.   

    楼主可以参考一下官方文档
    打开路径:java/util/regex/Pattern.html#sum
    或者,按如下次序打开API,
    String;
    String.matches();在String.matches();描述中有一个[正则表达式]的链接,可以看到正则表达式的详细文档。
    字符类 
    [abc] a、b 或 c(简单类) 
    [^abc] 任何字符,除了 a、b 或 c(否定) 
    [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
    [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) 
    [a-z&&[def]] d、e 或 f(交集) 
    [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) 
    [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) Greedy 数量词
    X? X,一次或一次也没有 
    X* X,零次或多次 
    X+ X,一次或多次 
    X{n} X,恰好 n 次 
    X{n,} X,至少 n 次 
    X{n,m} X,至少 n 次,但是不超过 m 次 
      

  2.   

    这个你可以去查一下java的API” X*? “   表示X可以是零次或多次
      

  3.   

    返回 false的原因是:在你的匹配中含有不能匹配的成分;
    e.g:
    把第1行的“a*b”改为“ab”:匹配ab但前面的aa就不能匹配了;
    “a*b”改为“a”:匹配a但ab就不能匹配了 、
    以下修改都包含不满足成分,
      

  4.   

    文档里面写的意思,我都明白,问题是,是以怎样一种形式写到方法里面呢?
    例如写在split()方法里面,是用"[|]"(用|作为分隔符),而写到compile()却是"a*b",没有了方括号“[]”了。而且,在compile()方法中,用"a",却不能在“aaaaab ”找到a出来,那么我在什么地方写错了呢?应该怎么写呢?
      

  5.   

    Matcher.matches()
    Attempts to match the entire region against the pattern. 
    上面是matches方法的说明,意思是查看你的pattern是否匹配整个字符串...ab或者a当让不能匹配整个的aaaaabPattern p = Pattern.compile("ab");        //1
        Matcher m = p.matcher("aaaaab");
        
        while(m.find()) {
         System.out.println(m.group());
        }lz应该是用pattern去搜索字符串,查看有无匹配,应该使用find()把这个pattern驱动起来
      

  6.   

    常用正则:http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365778.aspx
    正则获取固定email地址:http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365779.aspx
    使用正则把单数变小写,双数变大写!:http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365781.aspx
    使用正则统计项目代码量程序! :http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365780.aspx
      

  7.   

    5楼正解。matchs()为全局匹配。
    我自己最近也在研究。你把方法多研究下。再找几个例子。
    还有java的转义加2个斜杠
      

  8.   

    继续请教。
    写了几个测试例子,又发现问题。在JAVASCRIPT里面,有个/g和/i开关,/g在java中,被replaceAll方法解决了,但/i在java中,怎么写呢?
    例如,我想替代所有的Exec/eXec/exec等等为exec(相信大家都明白我想做的事情,就是防止注入式攻击),用replaceAll应该怎么写呢?
    谢谢。
      

  9.   

    两种方法String test1 = "Exec/eXec/exec";
    test=test1.replaceAll("(?i)exec", "");
    //方法一  使用表达式  "(?i)exec"
    String test2 = "Exec/eXec/exec";
    Matcher m = Pattern.compile("exec", Pattern.CASE_INSENSITIVE).matcher(test2);
    if (m.find()) test2 = m.replaceAll("");
    //方法二  Pattern.compile("exec",Pattern.CASE_INSENSITIVE)
      

  10.   

    够用????何谓够用??完全不用正则表达式,系统也可以运行我现在的代码,都没有用正则表达式的,但却很累赘,接触到javascript的正则表达式之后,才想到要把java里面的查找、替换功能(主要都是防止注入式攻击的代码)代码,全部用正则表达式更换。
    你说的正则表达式文档,我也看过,而且从头到尾看过几次,只看到用compile()方法中的flags标识,有CASE_INSENSITIVE选项,里面还说道可以用?i来进行不区分大小写的匹配。原文是:“通过嵌入式标志表达式  (?i) 也可以启用不区分大小写的匹配。”
    问题是:怎么用到replaceAll()里面呢?不经过Pattern类,简单很多的啊!!!
      

  11.   

    惭愧,打字太慢,问完,高手已经回答了。
    我要的就是第一种方法,我用了几个写法,例如exec?i、[exec]?i等等,都不行。原来是(?i)exec。
    再次谢谢各位。