最近小弟在用JAVA正则做一些数据采集,其中遇到一些不明之事,最让我费解的是正则表达式中的斜线问题
有如:
private static String zz="([\\s\\S]*?)"; //为什么要用四个斜线?
zurl_rule = zurl_rule.replaceAll("\[]", zz); //为什么要用又斜线
最近小弟在用JAVA正则做一些数据采集,其中遇到一些不明之事,最让我费解的是正则表达式中的斜线问题
有如:
private static String zz="([\\s\\S]*?)"; //为什么要用四个斜线?
zurl_rule = zurl_rule.replaceAll("\[]", zz); //为什么要用又斜线
http://tech.ddvip.com/2009-03/1238072554112363.html
字符串里面表示斜杠就需要两个斜杠如“\”
4个斜杠在正则表达式里面表示一个斜杠
其实我也比较难理解,和实现有关,需要看jdk源码,可以通过一些测试来搞清含义:
看下面代码
[code="java"]import java.util.regex.*;
public class RETest {
public static void main(String[] args) {
System.out.println("Test 1");
String zurl_rule = "=[]=";
String bb = "cc";
System.out.println(zurl_rule.replaceAll("\[]", bb));
System.out.println("Test 2");
String zz = "^([\\\\s\\\\S])$";
Pattern p = Pattern.compile(zz);
String str = "S";
Matcher m = p.matcher(str);
System.out.println(m.find());
str = "s";
m = p.matcher(str);
System.out.println(m.find());
str = "\\";
m = p.matcher(str);
System.out.println(m.find());
str = "\\\\";
m = p.matcher(str);
System.out.println(m.find());
}
}[/code]
运行结果:
[code="java"]Test 1
=cc=
Test 2
true
true
true
false[/code]
对Test 1:
zurl_rule.replaceAll("\[]", bb);
目地是想对[]进行替换,但是直接使用"[]"通不过编译,需要在[前面加上两个\。
对Test 2:
对于模式"^([\\s\\S])$" (注意我去掉了上面后面的*?,加上了^和$),
这个模式就是匹配一个字符,分别可以匹配一个\,s和S。由于字符串里面实际的一个斜杠,所以str = "\";来匹配为true。
其实"^([\\s\\S])$"是可以写成"^([s\\S])$"的,两次四个斜杠重复了,方括号里写一次就行了。