我有一个正则表达式,所有法律字符都经过精心挑选和转义,但它仍然无法捕获任何非法字符,即:$&
等:
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”
这里发生了什么?
答案 0 :(得分:2)
在一个字符类中,你需要通过将它放在结尾或开头或类中来转义文字-
;否则它会创造一个特征范围。
您忘记为!-_
执行此操作,因此从ascii代码33到95创建了一个大范围,现在:/?$
也会在否定字符类中捕获。
另外,请注意metacharacters aren't the same inside a character class并且您可以删除一些无用的转义。
尝试:
[^0-9a-zA-Z!_.*'()-]+