我有一个正则表达式,我已经使用RegexPal进行了测试,它在RegexPal中按预期工作,但在Java中没有预期的效果.我知道这是由于字符被转义的方式,但我看不出如何绕过它.
我的表达是:Pattern.compile("((([a-zA-Z0-9])([a-zA-Z0-9 ]*)\\?)+)")
.我在这里要做的是决定某个东西是否是目录的有效相对路径(现在只在Windows中),所以它应匹配"Hello","Hello World","Hello\World"之类的东西. ,"Hello World\foo\bar"等.相反,它只会在目录名称包含问号时匹配,例如."文档?".我认为这是因为在我的表达式中,双反斜杠必须在问号量词之前,但是当反斜杠被转义时所看到的compile()
是\?
它所假设的是一个转义的问号.
反正是否确保问号没有被转义?我试过在双反斜杠周围插入括号,但它只是逃避了右括号并导致"未闭合组错误"
使用4个反斜杠:
Pattern.compile("((([a-zA-Z0-9])([a-zA-Z0-9 ]*)\\\\?)+)")
^^^^
你需要匹配一个反斜杠char : \
.
反斜线为正则表达式一个特殊字符(用于预定义类如\d
例如),这需要由另一个反斜杠转义:\\
.
由于Java使用字符串文字作为regexp,反斜杠也是字符串文字的特殊字符(例如用于换行符char \n
),每个反斜杠需要通过另一个反斜杠进行转义:\\\\
.