参考下面的问题 - String.replaceAll带有双反斜杠的单反斜杠
我写了一个测试程序,我发现在两种情况下结果都是正确的,无论我是否逃避反斜杠.这可能是因为 - \t是可识别的Java String转义序列.(尝试\ s,它会抱怨). - \t在正则表达式中作为文字选项卡.我有点不确定原因.
有没有关于在Java中转义正则表达式的一般准则.我认为使用两个反斜杠是正确的方法.
我仍然想知道你的意见.
public class TestDeleteMe {
public static void main(String args[]) {
System.out.println(System.currentTimeMillis());
String str1 = "a b"; //tab between a and b
//pattern - a and b with any number of spaces or tabs between
System.out.println("matches = " + str1.matches("^a[ \\t]*b$"));
System.out.println("matches = " + str1.matches("^a[ \t]*b$"));
}
}
Run Code Online (Sandbox Code Playgroud)
转义序列有两种解释:首先是Java编译器,然后是regexp引擎.当Java编译器看到两个斜杠时,它会用一个斜杠替换它们.当有t一个斜杠时,Java用一个选项卡替换它; 当有t一个双斜杠时,Java就不管它了.但是,因为两个斜杠已被单个斜杠替换,所以regexp引擎会看到\t,并将其解释为选项卡.
我认为这是更清洁,让正则表达式解释\t为一个标签(即写"\\t"在Java中),因为它可以让你看到调试,记录等过程中其预期的形式表达如果转换Pattern与\t字符串,你会看到一个选项卡正则表达式中间的字符,可能会将其混淆为其他空格.使用模式\\t不存在这个问题:他们会向你展示\t一个单斜杠,告诉你,正是一种空白它们匹配.
第一个表单\\t将由模式类扩展为tab char.
\t在构建模式之前,第二个表单将由Java扩展为tab char.
最后,无论如何都会得到一个tab char.
是的,有一个关于转义的一般准则:Java源代码中的转义序列被Java编译器(或最终的某些预处理器)取代.编译器会抱怨它不知道的任何转义序列,例如\s.为RegEx模式编写字符串文字时,编译器将照常处理此文字,并使用相应的字符替换所有转义序列.然后,当程序执行时,Pattern类编译输入String,也就是说,它将再次评估转义序列.Pattern类知道\s为一个字符类,因此能够编译包含该类的模式.但是,您需要\s从不知道此转义序列的Java编译器中逃脱.为此,您可以转义反斜杠\\s.
简而言之,您总是需要两次转义RegEx模式的字符类.如果要匹配反斜杠,则正确的模式是\\\\因为Java编译器将使\\Pattern编译器将其识别为转义反斜杠字符.