正则表达式:如何逃避反斜杠和特殊字符?

有没有办法逃避(或保护)正则表达式中的特殊字符?

我想要做的是创建一个简单的正则表达式测试器:

import java.util.regex.*; class TestRegex { public static void main( String ... args ) { System.out.printf("%s ~= %s ? %s %n" , args[0], args[1], Pattern.matches( args[0], args[1] ) ); } } 

在将模式插入程序之前测试我的模式非常有用:

 $java TestRegex "\d" 1 \d ~= 1 ? true $java TestRegex "\d" 12 \d ~= 12 ? false $java TestRegex "\d+" 12 \d+ ~= 12 ? true $java TestRegex "\d+" a12 \d+ ~= a12 ? false $java TestRegex "\d+" "" \d+ ~= ? false 

我接下来要做的是在我的程序中使用这个模式,但每次我必须手动转义它:

 Pattern p = Pattern.compile( /*copy pasted regex here */ ); 

在此示例中,使用\\d替换: \d \\d 。 过了一会儿,这变得非常恼人。

问:如何自动逃避这些特殊字符?

您只需要用双反斜杠替换所有单个反斜杠。 这有点复杂,因为String上的replaceAll函数确实执行正则表达式,你必须首先转义反斜杠,因为它是一个文字(产生\\ ),然后因为正则表达式再次转义它(产生\\\\ )。 替换遭受类似的命运,需要两个这样的转义序列,使其总共有8个反斜杠:

 System.out.printf("%s ~= %s ? %s %n", args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...