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

2022-09-04 01:11:17

参考以下问题 - String.replace所有具有双反斜杠的单反斜杠

我写了一个测试程序,我发现无论我是否转义反斜杠,在这两种情况下的结果都是正确的。这可能是因为 - \t 是可识别的 Java 字符串转义序列。(尝试\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$")); 
  }
}

答案 1

对转义序列有两种解释:首先是 Java 编译器,然后是正则表达式引擎。当 Java 编译器看到两个斜杠时,它会将它们替换为一个斜杠。当有一个斜杠时,Java用一个标签代替它;当有一个后面的双斜杠时,Java会把它单独留下。但是,由于两个斜杠已被单个斜杠替换,因此正则表达式引擎会看到 ,并将其解释为选项卡。tt\t

我认为让正则表达式解释为一个选项卡(即用Java编写)会更干净,因为它可以让你在调试,日志记录等过程中看到表达式的预期形式。如果将 替换为 字符串,则会在正则表达式的中间看到一个制表符,并且可能会将其与其他空格混淆。带有的模式没有这个问题:它们会用单个斜杠向你显示 a,告诉你它们匹配的那种空格。\t"\\t"Pattern\t\\t\t


答案 2

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

简而言之,您始终需要对正则表达式模式的字符类进行两次转义。如果要匹配反斜杠,正确的模式是因为 Java 编译器会将其设置为模式编译器将识别为转义的反斜杠字符。\\\\\\