字符串为String str="120.128.3.242 music.baidu.com - [04/Jul/2012:22:59:59 +0800] 200";
如果只想把[] 内的空格替换为\t,正则表达式如何写。
非常感谢

解决方案 »

  1.   

    120.128.3.242 music.baidu.com - ([.*?]) 200
      

  2.   


    String str="120.128.3.242 music.baidu.com - [04/Jul/2012:22:59:59 +0800] 200";
             str= str.substring(str.indexOf("[")+1, str.indexOf("]")).replaceAll(" ", "\t") ;
             System.out.println(str);
      

  3.   

    2楼的处理完了只剩下一小段了吧?
            String str="120.128.3.242 music.baidu.com - [04/Jul/2012:22:59:59 +0800] 200";
            str = str.replaceAll("(\\[[^\\s]*)\\s([^\\]]*\\])","$1\t$2");
            System.out.println(str);
      

  4.   


    如果[]里面有多个空格键(\u0020)的话, 你这个solution就不好使了.
      

  5.   

    ldh911 真是强人,膜拜,佩服五体投地。
    能否请假如下这个正则?用 空格 分割如下字符串,但是这个空格不在 [] 和 "" 之内。就是说str字符串包括[]和"",分割时,[] 和 "" 的空格不分割
    String str = "27.152.72.211 music.xx.com - - [04/Jul/2012:22:59:59 +0800] \"GET /bg.png HTTP/1.1\" \"http://aa.bb.com/mobile?fr=mp3hp\" ID=85C4B31A:FG=1";
      

  6.   

    对,ldh911大神,就是这个意思。
    把除[]和""范围以外的空格,全部替换为 \t ;[]和"" 里面的空格不用替换。有什么好的办法实现?
      

  7.   

    不用想得太复杂,如果[]只有一个的话,用substring将内容分3块解决即可。
      

  8.   

    想了想,正则还是不太容易处理,只能编写函数来处理了:
        String str = "120.128.3.242 music.baidu.com - [04/Jul/2012:22:59:59 +0800] 200 \"GET /bg.png HTTP/1.1\" \"http://aa.bb.com/mobile?fr=mp3hp\" ID=85C4B31A:FG=1";
        System.out.println(spaceToTab(str));
        private static String spaceToTab(String str) {
            char[] cs = str.toCharArray();
            int brace = 0;
            boolean quota = false;
            for (int i = 0; i < cs.length; i++) {
                switch (cs[i]) {
                case '[':
                    brace++;
                    break;
                case ']':
                    brace--;
                    break;
                case '"':
                    quota = !quota;
                    break;
                case 32: // ASCII of Space
                    if (!quota && brace==0) cs[i] = '\t'; 
                }
            }
            return String.valueOf(cs);
        }