逃离regexpr的特殊符号

itu*_*tun 1 java regex

我用这个代码:

static Pattern escaper = Pattern.compile("([^a-zA-z0-9])");

public static String escapeRE(String str) {
    return escaper.matcher(str).replaceAll("\\\\$1");
}
Run Code Online (Sandbox Code Playgroud)

它工作得很漂亮,直到我不使用这个字符串:"[".我看着debuger结果是"]"没有"\\".

System.out.println(Main.escapeRE("+"));
System.out.println(Main.escapeRE(">="));
System.out.println(Main.escapeRE("]"));
System.out.println(Main.escapeRE("["));
Run Code Online (Sandbox Code Playgroud)

结果:

\\+
\\>\\=
]
[
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Bar*_*ers 7

你的角色类[^a-zA-z0-9]不正确.它应该是:( [^a-zA-Z0-9]注意A-Z而不是A-z).

由于两个[]包括在范围内A-z,他们不是你的替代escapeRE方法.

编辑

正如@Matt在评论中提到的:如果你试图逃避regex-meta-chars,请看一下专门为此目的创建的Pattern.quote(String)方法.