是否需要转义Java中正则表达式的斜杠(' /')字符

时间:2017-03-28 14:43:30

标签: java regex

我有以下代码段:

Pattern patternOfSlashContainingBackSlash=Pattern.compile("\\/");
Pattern patternOfSlashNotContainingBackSlash=Pattern.compile("/");

String slash = "/";

Matcher matcherOfSlashContainingBackSlash = patternOfSlashContainingBackSlash.matcher(slash);
Matcher matcherOfSlashNotContainingBackSlash = patternOfSlashNotContainingBackSlash.matcher(slash);

//both patterns match the slash
System.out.println(matcherOfSlashContainingBackSlash.matches());
System.out.println(matcherOfSlashNotContainingBackSlash.matches());  

我的问题:

  1. 两种模式之间有什么区别(从Java角度来看),还是有区别?

  2. 是' /'从Java的角度看,字符只是正则表达式的一个简单字符(不是像#'这样的特殊字符)?

  3. 我运行它的java版本是1.8

    这个问题与其他问题不同,因为它清楚地说明了模式" \\ /"和" /"与Java编程语言相同。

    非常感谢!

5 个答案:

答案 0 :(得分:4)

checks不是Java正则表达式中的特殊字符。 true相当于checks

答案 1 :(得分:3)

/在Java正则表达式中并不特殊,它在JavaScript中我们有语法/regex/flags。 Java允许转义字符,即使它们不需要它,可能会使这种正则表达式更具可移植性。因此Pattern.compile("\\/")Pattern.compile("/")的行为相同。

BTW ]本身并不是特殊字符。如果它不是[...]构造的一部分,你不需要逃避它,但你被允许(至少在Java中,我不确定其他的正则表达式)。

答案 2 :(得分:2)

正斜杠/字符不是Java Pattern表示中的命令字符(也不是普通String s),并且不需要转义。

反斜杠字符\需要在Java String中进行转义,因为它用于编码特殊序列,例如换行符("\n")。

E.g。 String singleBackslash = "\\";

由于反斜杠用于表示Java Pattern表示中的特殊构造,因此可能需要在Pattern定义中进行双重转义。

E.g。 Pattern singleBackSlash = Pattern.compile("\\\\");

有关涉及反斜杠的Pattern构造的示例,请参阅API

答案 3 :(得分:2)

没有必要逃避斜线字符。 Java的正则表达式语法的参考是类Pattern的Javadoc。在那里,它列出了所有具有特殊含义的字符。该列表中不存在斜杠。

答案 4 :(得分:2)

我认为人们逃避/字符的原因是它们来自不同的正则表达式(如Javascript),您可以在其中定义一个将它包含在两个斜杠之间的模式,如果您想匹配一个斜杠,需要逃脱它。

var pattern = /\d\/\d/; // Valid pattern of 2 digits divided by a slash, which must be escaped.

从Java的角度来看,它是等价的,因此没有必要逃避它。