Java Regex双反斜杠转义特殊字符

时间:2015-12-03 16:45:54

标签: java regex

我有一个我用RegexPal测试的正则表达式,它在RegexPal中按预期工作,但在Java中没有预期的效果。我知道这是由于字符被转义的方式,但我看不出如何绕过它。

我的表达是:Pattern.compile("((([a-zA-Z0-9])([a-zA-Z0-9 ]*)\\?)+)")。我在这里要做的是决定某个东西是否是目录的有效相对路径(现在只在Windows中),所以它应匹配“Hello”,“Hello World”,“Hello \ World”之类的东西。 ,“Hello World \ foo \ bar”等。相反,它只会在目录名称包含问号时匹配,例如。 “文档?”。我认为这是因为在我的表达式中,双反斜杠必须在问号量词之前,但是当反斜杠被转义时compile()看到的是\?,它假定是一个转义的问号

无论如何确保问号没有被转义?我尝试在双反斜杠周围插入括号,但它只是逃避了右括号并导致“未关闭的组错误”

1 个答案:

答案 0 :(得分:7)

使用4个反斜杠:

Pattern.compile("((([a-zA-Z0-9])([a-zA-Z0-9 ]*)\\\\?)+)")
                                               ^^^^
  1. 您需要匹配反斜杠字符:\
  2. 反斜杠是regexp的特殊字符(用于预定义的类,例如\d),需要通过另一个反斜杠进行转义:\\
  3. 由于Java使用字符串文字作为regexp,反斜杠也是字符串文字的特殊字符(例如用于换行符\n),每个反斜杠都需要通过另一个反斜杠进行转义:{{ 1}}。