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

Run*_*ion 12 java regex

参考下面的问题 - 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)

das*_*ght 9

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

我认为这是更清洁,让正则表达式解释\t为一个标签(即写"\\t"在Java中),因为它可以让你看到调试,记录等过程中其预期的形式表达如果转换Pattern\t字符串,你会看到一个选项卡正则表达式中间的字符,可能会将其混淆为其他空格.使用模式\\t不存在这个问题:他们会向你展示\t一个单斜杠,告诉你,正是一种空白它们匹配.


tim*_*tes 6

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

\t在构建模式之前,第二个表单将由Java扩展为tab char.

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

  • 这是正确的,*"我相信"*是没有必要的.``\\ t'`转换为Java字符串中的`"\ t"`,它转换为正则表达式引擎中的制表符."\ t"`转换为Java字符串中的制表符,在正则表达式中保持不变. (5认同)

Mic*_*ßer 6

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

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