有没有办法逃避(或保护)正则表达式中的特殊字符?
我想做的是创建一个简单的正则表达式测试器:
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
。过了一会儿,这变得非常恼人。
Q值。如何自动逃避这些特殊字符?
答案 0 :(得分:26)
您只需要用双反斜杠替换所有单个反斜杠。这有点复杂,因为replaceAll
上的String
函数确实执行了正则表达式,你必须首先转义反斜杠,因为它是一个文字(屈服\\
),然后再次转义它因为正则表达式(产生\\\\
)。替换遭受类似的命运,需要两个这样的转义序列,使其总共有8个反斜杠:
System.out.printf("%s ~= %s ? %s %n",
args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...