尝试使用Groovy脚本获取简单的字符串替换。尝试了各种各样的事情,包括以各种方式逃避字符串,但无法弄明白。
String file ="C:\\Test\\Test1\\Test2\\Test3\\"
String afile = file.toString() println
"original string: " + afile
afile.replace("\\\\", "/")
afile.replaceAll("\\\\", "/") println
"replaced string: " + afile
此代码导致:
original string: C:\Test\Test1\Test2\Test3\
replaced string: C:\Test\Test1\Test2\Test3\
由Sorrow启发的答案看起来像这样:
// first, replace backslashes
String afile = file.toString().replaceAll("\\\\", "/")
// then, convert backslash to forward slash
String fixed = afile.replaceAll("//", "/")
答案 0 :(得分:6)
replace
返回不同的字符串。在Java String
中无法修改,因此您需要将替换结果分配给某些内容,并将其打印出来。
String other = afile.replaceAll("\\\\", "/")
println "replaced string: " + other
编辑:正如Neftas在评论中指出的那样,\
是正则表达式中的特殊字符,因此必须两次转义。
答案 1 :(得分:2)
在Groovy中,你甚至不能写\\
- 它是一个不受支持的转义序列"。所以,我在这里看到的所有答案都是错误的。
如果你的意思是反斜杠,你应该写\\\\
。因此,将反斜杠更改为普通斜线将如下所示:
scriptPath = scriptPath.replaceAll("\\\\", "/")
如果你想替换对反斜杠,你应该加倍努力:
scriptPath = scriptPath.replaceAll("\\\\\\\\", "/")
这些行已成功用于我刚才有意推出的Gradle / Groovy脚本 - 只是为了确定。
更有趣的是,展示这些必要的八个反斜杠" \\\\\\\\#34;在StackOverflow上的普通文本中,我必须使用其中的十六个!对不起,我不会告诉你这16个,因为我需要32个!它永远不会结束......
答案 2 :(得分:1)
1)afile.replace(...)不会修改你正在调用它的字符串,它只返回一个新字符串。
2)从Java的角度来看,输入字符串(String file =“C:\\ Test \\ Test1 \\ Test2 \ Test3 \\”;)只包含单个反斜杠。第一个反斜杠是转义字符,然后第二个反斜杠告诉它你实际上想要一个反斜杠。
所以
afile.replace("\\\\", "/");
afile.replaceAll("\\\\", "/");
应该是......
afile = afile.replace("\\", "/");
afile = afile.replaceAll("\\", "/");
答案 3 :(得分:1)
如果您正在使用路径,那么最好使用java.io.File对象。它会自动将给定路径转换为正确的操作系统相关路径。
例如,(在Windows上):
String path = "C:\\Test\\Test1\\Test2\\Test3\\";
// Prints C:\Test\Test1\Test2\Test3
System.out.println(new File(path).getAbsolutePath());
path = "/Test/Test1/Test2/Test3/";
// Prints C:\Test\Test1\Test2\Test3
System.out.println(new File(path).getAbsolutePath());
答案 4 :(得分:0)
String Object是不可变的,因此如果在字符串对象上调用一个修改它的方法。它将始终返回一个新的字符串对象(已修改)。因此,您需要将replaceAll()方法返回的结果存储到String对象中。
答案 5 :(得分:0)
在Groovy中,你也可以用这种方式使用正则表达式:
afile = afile.replaceAll(/(\\)/, "/")
println("replaced string: "+ afile)
注意(如Sorrow所说)replaceAll返回结果,不修改字符串。因此,您需要在打印前分配给var。
答案 6 :(得分:0)
如找到here,最佳候选人可能是static
Matcher
方法:
Matcher.quoteReplacement( ... )
根据我的实验,这会使单个反斜杠加倍。尽管有方法名称......尽管有一点点神秘的Javadoc:"斜杠(' \')和美元符号(' $')将没有特别含义& #34;