我有以下代码段:
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());
我的问题:
两种模式之间有什么区别(从Java角度来看),还是有区别?
是' /'从Java的角度看,字符只是正则表达式的一个简单字符(不是像#'这样的特殊字符)?
我运行它的java版本是1.8
这个问题与其他问题不同,因为它清楚地说明了模式" \\ /"和" /"与Java编程语言相同。
非常感谢!
答案 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的角度来看,它是等价的,因此没有必要逃避它。