java 中的正则什么时候用斜线,用多少斜线

最近小弟在用JAVA正则做一些数据采集,其中遇到一些不明之事,最让我费解的是正则表达式中的斜线问题
有如:

private static String zz="([\\s\\S]*?)"; //为什么要用四个斜线?

zurl_rule = zurl_rule.replaceAll("\[]", zz); //为什么要用又斜线

http://tech.ddvip.com/2009-03/1238072554112363.html

  1. 字符串里面表示斜杠就需要两个斜杠如“\”

  2. 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])$"的,两次四个斜杠重复了,方括号里写一次就行了。

其实很好理解。
这么说吧,在正则表达式里,因为"\"是特殊字符,所以如果要表示一个"\",则必须要写成"\"
然后,你可以试试从一个txt文件中读入"\",在java里的字符串中长度就是2,用这个作为正则表达式,就可以匹配"\"

如果你要把String直接写在原代码里,那么我们知道为了表示一个“\”必须用“\”
其结果就是:
String s = "\\";
表示的其它是一个长度为2的字符串,其内容为"\"

在String.replaceAll(...)中,第一个参数是使用正则表达式的,所以"\[]"(字符串内容其实是"[]")会匹配"[]"(对于正则表达式,"[]"方括号是有特殊含义的,所以表示方括号必须用转义"[]")