Java中Pattern.compile(“编译”)和Pattern.compile(“编译”)的匹配有什么区别?

Java中Pattern.compile(“编译”)和Pattern.compile(“编译”)的匹配有什么区别?,java,escaping,pattern-matching,Java,Escaping,Pattern Matching,两者似乎都是双引号 我知道\*与regex中的字符*匹配,() 由于*是一个特殊字符,因此对正则表达式使用反斜杠对其进行转义 但双引号并不是正则表达式的特殊字符。那么为什么在双引号之前需要反斜杠呢 在我的公司代码库中,他们使用模式。编译(“\\\”)根据我的经验,我认为在双引号之前不需要反斜杠,在大多数情况下不需要反斜杠: System.out.println(Pattern.compile("^\"$").asPredicate().test("\"")); 结果是真的 System.out

两者似乎都是双引号

我知道
\*
与regex中的字符
*
匹配,()

由于
*
是一个特殊字符,因此对正则表达式使用反斜杠对其进行转义

但双引号并不是正则表达式的特殊字符。那么为什么在双引号之前需要反斜杠呢


在我的公司代码库中,他们使用
模式。编译(“\\\”)

根据我的经验,我认为在双引号之前不需要反斜杠,在大多数情况下不需要反斜杠:

System.out.println(Pattern.compile("^\"$").asPredicate().test("\""));
结果是真的

System.out.println(Pattern.compile("^\\\"$").asPredicate().test("\""));
System.out.println(Pattern.compile("^\\\"$").asPredicate().test("\\\""));
结果是真的

System.out.println(Pattern.compile("^\\\"$").asPredicate().test("\""));
System.out.println(Pattern.compile("^\\\"$").asPredicate().test("\\\""));
结果为false。因此,如果要匹配\”,则需要在regexp中加上双反斜杠:

System.out.println(Pattern.compile("^\\\\\"$").asPredicate().test("\\\""));
结果是真的


如果生成regexp字符串,则需要在每个双引号之前添加反斜杠,除非不能匹配反斜杠+双引号。

没有区别。有些人喜欢转义模式中的所有“特殊”(非单词)字符。如果你想清楚地表明你不希望它被用作特殊字符(否则读者需要知道这一点)@WiktorStribiżew为什么没有区别?因为
\“
模式匹配相同的
符号与
模式相同。