Groovy:如何在字符串中包含反斜杠而不需要转义?

29
我想在我的Groovy程序中使用以下字符串文字,而不必转义反斜杠:
C:\dev\username
到目前为止我已经尝试了以下方法:

单引号字符串和双引号GStrings

def aString = 'C:\\dev\\username'
def aGString = "C:\\dev\\username"
  • 不起作用,因为\具有特殊含义并用于转义其他字符
  • 我最终不得不使用另一个\来转义\

Slashy字符串和Dollar Slashy字符串

适用于一些字符串,例如以下内容:

def slashy = /C:\windows\system32/
def dollarSlashy = $/C:\windows\system32/$

但它将\u解释为具有特殊含义(以下不起作用):

def s1 = /C:\dev\username/
def s2 = $/C:\dev\username/$
  • Groovy:未找到四位十六进制字符代码

你不行。在Java和Groovy中,\有特殊的含义,所以你需要对它们进行转义。但如果这是一个文件路径,你应该能够使用斜杠。 - tim_yates
@tim_yates 为什么 def slashy = /C:\windows\system32/ 这样的写法似乎是有效的呢? - Mike R
它可以正常工作,因为它认为你正在定义一个Unicode字符,正如你所发现的那样。 - tim_yates
@MikeR '/.../' 是“创建一个模式”的简写,因此你最终可能会遇到其他问题。 - cfrick
1
备选方案:因为在Windows中,/可以用作路径分隔符代替\,所以您可以直接使用def path = "C:/windows/system32/" - Mike Rosoft
1个回答

14

哇,将Windows文件路径放入正斜杠字符串中时又出了一个坑。很好的发现。我之前遇到的坑是在路径末尾包含反斜杠,例如/C:\path\/,这会导致unexpected char: 0xFFFF错误。

无论如何,为了回答问题,考虑到Windows路径不区分大小写,为什么不利用一下呢?

def s = /C:\DEV\USERNAME/
\u Unicode字符转义序列区分大小写

4
Windows路径默认配置为不区分大小写,但它们并非(即从未)无法识别大小写。因此,如果想要创建名为“username”的目录,则必须使用小写的“...\username”。 - Klitos Kyriacou
6
到 Groovy 2.4.10 版本为止,“unexpected char: 0xFFFF” 错误仍是一个问题。通过使用“美元斜杠”字符串,可以修复这个问题,例如 $ /C:\Path\To\Some\Place\/$ - secondbreakfast
1
Windows路径默认情况下是不区分大小写的。但用户可以通过“ObCaseInsensitive”注册表键(全局)或“fsutil setCaseSensitiveInfo”(每个文件夹)打开大小写敏感性。因此,基于此答案的代码将无法正常工作。不应接受此答案! - Basil Peace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接