少了条反斜线转义:String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\]]+)\\]";String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\\]]+)\\]";
java的字符串里\\才表示\,而正则表达式里\\才表示\。因此要表示正则表达式里的\,java的字符串里就要写成了\\\\,
比如下例,是把一条斜线替换成两条斜线:    /**
     * 用来对字符串进行转义处理,以保证可以正确插入到postgreSQL数据库中
     * @param str String
     * @return String
     */
    public static String FilterPostgresSQLString(String str) {
        return str == null ? str : str.replaceAll("\\\\",
                                                  "\\\\\\\\").replaceAll("'",
                "''");
    }ps :《Java正则表达式详解》我没有完全看完过,有错的地方,我也不太清楚。附一个以前写的ip校验的正则表达式:
    public static boolean isValidIPAddr(String aString) {
        //IPV4的地址是四段的。长度在7到15 之间,每一段的大小为[0-255]
        //利用正则表达式之能够约束到三位的时候,最高位置能够是0,1,2开头
        if (aString == null || aString.length() < 7 || aString.length() > 15) {
            return false;
        }
        if (ipAddrPattern == null) {
            ipAddrPattern = Pattern.compile(
                    "^([012]?[\\d]{1,2}\\.){3}[012]?[\\d]{1,2}$");
            // 不约束最高位的正则表达式="^([\\d]{1,3}\\.){3}[\\d]{1,3}$");
            //可以加强一下对三位的ip的验证,最大只能够是用0,1,2开头的
            //"^(([\\d]{1,2}\\.){3}[\\d]{1,2})|(([012][\\d]{1,2}\\.){3}[012][\\d]{1,2})$"
        }
        return ipAddrPattern.matcher(aString).find();
    }

解决方案 »

  1.   

    我上面把你说的情况已经都已经执行过了java中的反斜杠我清楚。就是第一个程序,你在看看他的提示错误,我感觉到有些莫名其妙!
      

  2.   

    Java正则表达式详解 这书有卖吗,给个地址,急切寻找。
      

  3.   


    你 是说这行吗???
    ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]所有的\都要写成\\。java才认识.正则表达式里]也需要转义,因此就要写成\],再加上java的转义,所以要写成\\].
      

  4.   

    我这样写也出错误,请看:import java.util.regex.*;    public class RegexTest{

            public static void main(String args[]){
        Pattern pattern = null;
        Matcher matcher = null;

        String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\\]]+)\\]";
        System.out.println("s1 = "+s1);
        String s2 = "172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15 ";
        System.out.println("s2 = "+s2);

        // Match true 
        pattern = Pattern.compile(s1);
        matcher = pattern.matcher(s2);
        while (matcher.find()){
     System.out.println("matcher.group(0) = "+matcher.group(0));
     System.out.println("matcher.group(1) = "+matcher.group(1));     }
    }
        }错误:
    s1 = ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]
    s2 = 172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]"GET/IsAlive.htm HTTP/1.0"200 15 
    java.util.regex.PatternSyntaxException: Unclosed character class near index 66
    ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]
                                                                      ^
            at java.util.regex.Pattern.error(Pattern.java:1528)
            at java.util.regex.Pattern.clazz(Pattern.java:2042)
            at java.util.regex.Pattern.sequence(Pattern.java:1585)
            at java.util.regex.Pattern.expr(Pattern.java:1545)
            at java.util.regex.Pattern.compile(Pattern.java:1279)
            at java.util.regex.Pattern.<init>(Pattern.java:1035)
            at java.util.regex.Pattern.compile(Pattern.java:779)
            at RegexTest.main(RegexTest.java:15)
    Exception in thread "main" 
    Process completed.
      

  5.   

    to  umbrella1984(雨伞) ,我上面不是写出了《Java正则表达式详解》URL吗!http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp
      

  6.   

    String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\\]]+)\\]";
    String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]";[也是需要转义的\\[
    最后那部分[([^\\]]+)\\]";应该是\\[([^\\]]+)\\]";to  andy100085(铁桶师傅):转义表示即可\.。在java字符串里则是\\.你如果仔细看上面的回复,就会发现到处都用到了的。
      

  7.   

    注意\\s后面的“[”字符,要转义,加上\\  String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]";
        System.out.println("s1 = "+s1);
        String s2 = "172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15 ";
        System.out.println("s2 = "+s2);打印出匹配的两个部分while (matcher.find()){
     //System.out.println("matcher.group(0) = "+matcher.group(0));
     System.out.println("matcher.group(1) = "+matcher.group(1));
     System.out.println("matcher.group(2) = "+matcher.group(2));
        }
      

  8.   

    to  pigo(随遇),我知道这个程序哪儿错了,首先谢谢你的指点!
    ------------------------------------------------------------
    还是有个问题,请看:Exmple:    分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下:  
         172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15 
        分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。  
        首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。显示了为IP地址编写的正则表达式:  
                  \d{1,3} \. \d{1,3} \. \d{1,3} \. \d{1,3} 
        IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。  
    日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。显示了这部分的正则表达式:  
                      \[  [ ^] ]+  \]
        现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如下所示:
              (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) \s-\s-\s \[([^]]+)\]
    ------------------------------------------------------------------------------------
    问题:我么在java中变换的正则表达式,最终也要符合我上面的分析出的正则表达式呀但是为了匹配第二个圆括号中的值,我们改成这样了:[([^\\]]+)\\]“验证java中你的正则表达式写的对不对,最好的办法是打印出来看于原来的一样不?”--这是文章中的一句话,我们现在打印出来的s1为:
             ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s\[([^\]]+)\]于原来的正则表达式不一样了呀?这是为什么?这样做对不?谢谢楼下的您!!
     
      

  9.   

    归根到底是字符转义问题。\\是写给java看的。而\是java输出给你看的,刚才去看一眼那篇文章,应该那里的正则表达式写疏忽了,也少了个转移的斜线(但是其它两处用到中括号的地方是正确转义的了).
      

  10.   

    http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp
    《Java正则表达式详解》好文章