我在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/$;