我在Windows中有一条路径:
assert f.toString() == 'C:\\path\\to\\some\\dir'
我需要将反斜杠\
转换为正斜杠/
。使用Java语法,我会写:
assert f.toString().replaceAll('\\\\', '/') == 'C:/path/to/some/dir'
但我正在研究Groovy,所以我想我会写一个文字的正则表达式:
assert f.toString().replaceAll(/\\/, '/') == 'C:/path/to/some/dir'
这会引发编译错误:
意外令牌:)== at line:4,column:42
我开始在互联网上查找,并发现一些评论表明这个特定的正则表达式字面值不起作用,而是你必须使用像/\\+/
这样的解决方法。但这显然改变了正则表达式的语义。
我无法理解为什么/\\/
不起作用。也许有人呢?
答案 0 :(得分:2)
slashy字符串末尾的\
会破坏它。
重点是您需要将\
与/
尾随的斜线字符串分隔符分开。
可以通过以下几种方式完成:
println(f.replaceAll('\\\\', '/')) // Using a single-quoted string literal with 4 backslashes, Java style
println(f.replaceAll(/[\\]/, '/')) // Wrapping the backslash with character class
println(f.replaceAll(/\\{1}/, '/')) // Using a {1} limiting quantifier
println(f.replaceAll(/\\(?:)/, '/')) // Using an empty group after it
请参阅Groovy demo。
但是,您可以使用美元的字符串来使用字符串末尾的反斜杠:
f.replaceAll($/\\/$, '/')
请参阅demo并查看this thread:
Slashy strings :反斜杠转义行结束字符和斜杠,
$
转义插值变量/闭包,不能将反斜杠作为最后一个字符,空字符串不允许。示例:def a_backslash_b = /a\b/; def a_slash_b = /a\/b/;
美元贬值字符串:反斜杠只转义EOL,
$
转义内插变量/闭包及其本身(如果需要)和斜杠(如果需要),使用$$
来{{1}作为最后一个字符或者在标识符或大括号或斜杠之前有$
,使用$
在$/
之前有一个斜杠,不允许使用空字符串。示例:$