Groovy文字正则表达式/ \\ /没有编译

时间:2017-06-08 09:19:17

标签: java regex groovy backslash

我在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

我开始在互联网上查找,并发现一些评论表明这个特定的正则表达式字面值不起作用,而是你必须使用像/\\+/这样的解决方法。但这显然改变了正则表达式的语义。

我无法理解为什么/\\/不起作用。也许有人呢?

1 个答案:

答案 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}作为最后一个字符或者在标识符或大括号或斜杠之前有$,使用$$/之前有一个斜杠,不允许使用空字符串。示例:$