Java / scala正则表达式不匹配插入符号表示的特殊字符

时间:2014-11-01 23:10:38

标签: regex scala

我有一个正则表达式,所有法律字符都经过精心挑选和转义,但它仍然无法捕获任何非法字符,即:$&等:

val result = "http://example.com?re#k2$si".replaceAll("""[^0-9a-zA-Z!-_\.\*'\(\)]+""","/")
assert(url === "http/example.com/re/k2/si")

但结果是:

  

TestFailedException:“http [://example.com?re#k2 $] si”不等于“http [/example.com/re/k2/] si”

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

在一个字符类中,你需要通过将它放在结尾或开头或类中来转义文字-;否则它会创造一个特征范围。

您忘记为!-_执行此操作,因此从ascii代码33到95创建了一个大范围,现在:/?$也会在否定字符类中捕获。

另外,请注意metacharacters aren't the same inside a character class并且您可以删除一些无用的转义。

尝试:

[^0-9a-zA-Z!_.*'()-]+