求一正则要求以//开头但前面不能有/*, 可以有/**/ 
示例 
aa555//aaa    匹配//aaa 
aa5/*55//aaa  不匹配 
aa5/*sos*/55//aaa    匹配//aaa
----------------------------------------
public class Test {    public static void main(String[] args) throws IOException {
        String multiComment     = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";
        String singleComment    = "//[^\r\n]*+";
        String quoteString      = "\"[^\\\\\"]*(?:\\\\.[^\\\\\"]*)*\"";请问这里那么多的\是什么意思有些看不懂了,quotostring是表示哪一块?
        String regex = multiComment + "|" + quoteString + "|(" + singleComment + ")";
        
        String str = FileUtil.readFile2String("f:/Test.java");
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            if(matcher.start(1) > -1) {
                System.out.println(matcher.group(1));
            }
        }
    }
}

解决方案 »

  1.   

    在[]里不是不需要转义吗?
    package net.csdn.java;import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;public class Test {    /**
         * "regex"  // hello
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            String name = "大/*家" + "好*/啊" + "// comment";  // comment 
            URL url = new URL("http://localhost:8080/test/ReceiveData");   // request URL
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setRequestMethod("POST");   // set POST request method
            /* 请求头 // content-type */
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setUseCaches(false);        // add request parameters
            DataOutputStream dos = new DataOutputStream(con.getOutputStream());
            dos.writeBytes("name=" + URLEncoder.encode(name, "gbk"));
            dos.writeBytes("&age=" + URLEncoder.encode("1234", "gbk"));
            dos.flush();
            dos.close();        System.out.println(con.getResponseCode());
            con.disconnect();
        }    /**
         * 计算 2 + 22 + 222 的值
         * @param num       不断增加的数字
         * @param digit     总共的位数
         * @return
         */
        public static int add(int num, int digit) {
            int n = 0;
            for(int i = 1; i <= digit; i++) {
                n = n * 10 + i * num;
            }
            return n;
        }    public static void printDiamond(int line, boolean isSolid) {
            boolean b = true;
            for(int k = line / 2, i = -k; i <= k; i++) {
                for(int j = -k, m = k - Math.abs(i); j <= m; j++) {
                    if(isSolid) {
                        // 实心菱形
                        b = Math.abs(j) <= m;
                    } else {
                        // 空心菱形
                        b = Math.abs(j) == m;
                    }
                    System.out.print(b ? '*' : ' ');
                }
                System.out.println();
            }
        }    /**
         * 计算 num 的阶乘
         * @param num
         * @return
         */
        private static int factorial(int num) {
            return factorial(1, num);
        }    /**
         * 计算 start * (start + 1) * (start + 2) * ... * end 的值
         * @param start     阶乘的起始数
         * @param end       阶乘的结束数
         * @return
         */
        private static int factorial(int start, int end) {
            if(start > end) {
                int t = start;
                start = end;
                end = t;
            }
            int result = start > 0 ? start : 1;
            // calculate factorial
            while(end > start) {
                result *= end--;
            }
            return result;
        }
    }
      

  2.   

    quoteString 匹配双引号字符串的正则表达式,那么多的 \ 是为了转义而存在的。\ 在 Java 字符串和正则表达式中都属于转义字符,因此在 Java 字符串中得使用 \\\\ 才能表示 \ 字符。
    首先,\\\\ 被 Java 编译器转义成为 \\,之后再次被正则表达式引擎转义成为 \ 字符,这里经过了双重转义。你看到的 \\\\\" 实际上就是 \ 和 " 两个字符。拆成以下四个部分来看第一部分:\"
    字符串开始的引号第二部分:[^\\\\\"]*
    处理普通字符。除了 \ 和 " 之外的字符,匹配字符串中所有非引号和非带转义字符 \ 的字符。第三部分:(?:\\\\.[^\\\\\"]*)*
    处理特殊字符。因为特殊字符都是带有转义字符 \ 的,因此表达式 \\\\. 表示 \ 加另外一个字符,这样就能匹配特殊字符了。
    而后面的同样是普通字符。为了下面描述更为清楚 \\\\. 称为第三部分A,第三部分A能匹配两个字符
    [^\\\\\"] 称为第三部分B。需要注意的是第三部分B可以出现零次或多次,而整个第三部分也能出现零次或多次,也表明如果字符串中出现一个转义字符的话,
    那么第三部分就开始起作用了,否则全部使用第二部分。第四部分:\"
    字符串结束的引号比如字符串 "test\\abc\"hello\\\"";其中的 " 被上述第一部分匹配
    test 这 4 个字符被第二部分匹配\\ 被第三部分A匹配
    abc 被第三部分 B 所匹配\" 再被第三部分A匹配
    hello 这 5 个字符被第三部分 B 匹配\\ 再次被第三部分A匹配,由于 \\ 后面又是 \ 字符,因此第三部分 B 变成零长度匹配。接下来的 \" 再被第三部分A所匹配,再后面的字符是 " 这时第三部分 A 和 B 都不能匹配这个字符了,
    因此跳出第三部分的循环状态,这时正好能被第四部分匹配,至此为止所有的字符均得到了匹配,也就是
    匹配成功了。
      

  3.   

    这个字符串的匹配过程可以划分成为下面几段:"  test  \\abc  \"hello  \\  \"  "
    1  2     3      4        5   6   73~6 段被第三部分所匹配,注意看一下规律,第三部分总是以 \ 字符开头的,而且除了 \ 之外至少还有一个其他的字符,
    这也正是 Java 语言中转义所规定的语法。
      

  4.   

    匹配 Java 语言中的字符串,我们并不能简单地使用 \".*?\" 或者 \"[^\"]*\" 来进行匹配,
    如果是这样做的话,就没有把字符串中的引号考虑进去了。