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