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


这将引发编译错误:


  意外令牌:) ==在第4行,第42列


我开始在互联网上寻找内容,发现一些评论表明该特定的正则表达式文字不起作用,相反,您必须使用类似/\\+/的变通方法。但这显然改变了正则表达式的语义。

我真的不明白为什么/\\/不起作用。也许有人吗?

最佳答案

斜线字符串末尾的\将其破坏。

要点是,您需要将\/尾部的斜线字符串定界符分开。

可以通过几种方式完成:

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


  斜线字符串:反斜杠转义行末尾的字符和斜杠,$转义内插变量/闭包,不能将反斜杠作为最后一个字符,不允许使用空字符串。示例:def a_backslash_b = /a\b/; def a_slash_b = /a\/b/;
  
  美元斜线字符串:反斜杠仅对EOL进行转义,$对插值变量/闭包及其自身进行转义(如果需要),如果需要则进行反斜杠,请使用$$$作为最后一个字符,或者将$作为标识符或小写之前大括号或斜杠,请在$/前使用$进行斜杠,不允许使用空字符串。示例:def a_backslash_b = $/a\b/$; def a_slash_b = $/a/b/$; def a_dollar_b = $/a$$b/$;

10-05 20:43
查看更多