求一正则要求以//开头但前面不能有/*, 可以有/**/
示例
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));
}
}
}
}
示例
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));
}
}
}
}
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;
}
}
首先,\\\\ 被 Java 编译器转义成为 \\,之后再次被正则表达式引擎转义成为 \ 字符,这里经过了双重转义。你看到的 \\\\\" 实际上就是 \ 和 " 两个字符。拆成以下四个部分来看第一部分:\"
字符串开始的引号第二部分:[^\\\\\"]*
处理普通字符。除了 \ 和 " 之外的字符,匹配字符串中所有非引号和非带转义字符 \ 的字符。第三部分:(?:\\\\.[^\\\\\"]*)*
处理特殊字符。因为特殊字符都是带有转义字符 \ 的,因此表达式 \\\\. 表示 \ 加另外一个字符,这样就能匹配特殊字符了。
而后面的同样是普通字符。为了下面描述更为清楚 \\\\. 称为第三部分A,第三部分A能匹配两个字符;
[^\\\\\"] 称为第三部分B。需要注意的是第三部分B可以出现零次或多次,而整个第三部分也能出现零次或多次,也表明如果字符串中出现一个转义字符的话,
那么第三部分就开始起作用了,否则全部使用第二部分。第四部分:\"
字符串结束的引号比如字符串 "test\\abc\"hello\\\"";其中的 " 被上述第一部分匹配
test 这 4 个字符被第二部分匹配\\ 被第三部分A匹配
abc 被第三部分 B 所匹配\" 再被第三部分A匹配
hello 这 5 个字符被第三部分 B 匹配\\ 再次被第三部分A匹配,由于 \\ 后面又是 \ 字符,因此第三部分 B 变成零长度匹配。接下来的 \" 再被第三部分A所匹配,再后面的字符是 " 这时第三部分 A 和 B 都不能匹配这个字符了,
因此跳出第三部分的循环状态,这时正好能被第四部分匹配,至此为止所有的字符均得到了匹配,也就是
匹配成功了。
1 2 3 4 5 6 73~6 段被第三部分所匹配,注意看一下规律,第三部分总是以 \ 字符开头的,而且除了 \ 之外至少还有一个其他的字符,
这也正是 Java 语言中转义所规定的语法。
如果是这样做的话,就没有把字符串中的引号考虑进去了。