Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java,正则表达式,需要在正则表达式中转义反斜杠_Java_Regex - Fatal编程技术网

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

java,正则表达式,需要在正则表达式中转义反斜杠,java,regex,Java,Regex,关于以下问题— 我写了一个测试程序,我发现结果在这两种情况下都是正确的,不管我是否避开反斜杠。这可能是因为 -\t是可识别的Java字符串转义序列。(尝试\s,它会抱怨)。 -\t作为正则表达式中的文字选项卡。 我有点不确定原因 是否有关于在Java中转义正则表达式的一般准则。我认为使用两个反斜杠是正确的方法 我还是想知道你的意见 public class TestDeleteMe { public static void main(String args[]) { System

关于以下问题—

我写了一个测试程序,我发现结果在这两种情况下都是正确的,不管我是否避开反斜杠。这可能是因为 -\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$")); 
  }
}

第一个表单
\\t
将由pattern类扩展为选项卡字符

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


最后,无论哪种方式都会得到一个tab字符。

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


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

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


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

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

这是正确的,不需要“我相信”。
“\\t”
在Java字符串中转换为
“\t”
,在正则表达式引擎中转换为制表符。
“\t”
转换为Java字符串中的制表符,在正则表达式中保持不变。谢谢。我理解。因此,您需要用Java编写
字符串
,以便模式引擎得到它所期望的结果。我想我将来在用Java编写正则表达式时必须非常小心。谢谢。现在我了解到正则表达式引擎既能理解
[\t]
(\t在空格后)又能理解
[]
(空格后的制表符)并对它们进行相同的处理。你认为我说的对吗<代码>[\t]
看起来更容易理解。因此,我必须在Java中使用
[\\t]
。@SatishMotwani“must”这个词太强了,但是让
\\t
流到regexp是一个很好的做法。我试图用2或4个反斜杠来转义
\*
\d
(获取星号和数字),但运气不佳。当我使用4个反斜杠和
StringEscapeUtils.unescapeJava
时,它工作了!这救了我的理智;非常感谢。