java,正则表达式,需要在正则表达式中转义反斜杠

参考下面的问题 – String.replaceAll单反斜杠和双反斜杠

我写了一个测试程序,我发现在两种情况下结果都是正确的,无论我是否逃避反斜杠。 这可能是因为 – \ t是可识别的Java String转义序列。 (尝试\ s,它会抱怨)。 – \ t在正则表达式中作为文字选项卡。 我有点不确定原因。

有没有关于在Java中转义正则表达式的一般准则。 我认为使用两个反斜杠是正确的方法。

我仍然想知道你的意见。

public class TestDeleteMe { public static void main(String args[]) { System.out.println(System.currentTimeMillis()); String str1 = "ab"; //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$")); } } 

转义序列有两种解释:首先是Java编译器,然后是regexp引擎。 当Java编译器看到两个斜杠时,它会用一个斜杠替换它们。 当有一个斜杠后,Java用一个选项卡替换它; 当双斜杠后面有一个t时,Java就不管它了。 但是,因为两个斜杠已被单个斜杠替换,所以regexp引擎会看到\t ,并将其解释为选项卡。

我认为让正则表达式将\t解释为选项卡(即在Java中编写"\\t" )更为清晰,因为它允许您在调试,日志记录等过程中以预期forms查看表达式。如果转换Pattern\t到字符串,您将在正则表达式的中间看到一个制表符,并可能将其混淆为其他空格。 具有\\t模式没有这个问题:它们会向您显示带有单个斜杠的\t ,告诉您它们匹配的空白类型。

是的,有一个关于转义的一般准则:Java源代码中的转义序列被Java编译器(或最终的某些预处理器)取代。 编译器会抱怨它不知道的任何转义序列,例如\s 。 为RegEx模式编写字符串文字时,编译器将照常处理此文字,并使用相应的字符替换所有转义序列。 然后,当程序执行时,Pattern类编译输入String,也就是说,它将再次评估转义序列。 Pattern类知道它是一个字符类,因此能够编译包含该类的模式。 但是,您需要从不知道此转义序列的Java编译器中转义。 为此,您可以转义反斜杠,从而产生\\s

简而言之,您总是需要两次转义RegEx模式的字符类。 如果要匹配反斜杠,则正确的模式为\\\\因为Java编译器将使其成为模式编译器将识别为转义反斜杠字符的模式。

第一个表单\\t将被模式类扩展为tab char。

在构建模式之前,第二种forms\t将被Java扩展为制表符char。

最后,无论如何都会得到一个tab char。

使用org.apache.commons.lang3.StringEscapeUtils.unescapeJava(…),您可以转义大多数常见的spl.chars以及unicode字符(将unicode字符集转换为可读的常规字符)