我是Groovy的新手。我有點困惑。groovy replaceAll奇怪的行爲
Groovy代碼:
def str = 'D:\\bin'
def newStr = str.replaceAll(args[0],args[1])
println 'str :' + str + ' (' + str.length() + ')'
println 'newStr :' + newStr + ' (' + newStr.length() + ')'
println 'args[0]:' + args[0] + ' (' + args[0].length() + ')'
println 'args[1]:' + args[1] + ' (' + args[1].length() + ')
assert str == args[0]
,現在測試一下:
>groovy test.groovy D:\bin C:\data
str :D:\bin (6)
newStr :D:\bin (6)
args[0]:D:\bin (6)
args[1]:C:\data (7)
的replaceAll什麼都不做。 ,另一個測試:
>groovy test.groovy D:\\bin C:\\data
str :D:\bin (6)
newStr :C:\data (7)
args[0]:D:\\bin (7)
args[1]:C:\\data (8)
Caught: Assertion failed:
assert str == args[0]
| | | |
| | | D:\\bin
| | [D:\\bin, C:\\data]
| false
D:\bin
的replaceAll現在工作得很好,但是我們可以看到「STR」不等於「ARGS [0]」 在我看來的GString和字符串是不同的。
現在的問題是:爲什麼長度不同(「D:\ bin」 - 6,「D:\\ bin」 - 7),但替換完成。
這與'GString'無關(上面的字符串都不是'GString's)。試試:''D:\\ bin'.replaceAll('D:\\\\ bin','C:\\ data')'這是一個轉義問題 –
,你可以看到它正在工作。但奇怪的行爲。查看結果newStr是'C:\ data',但args [1]是'C:\\ data'。字符串不同而且長度不同。 –
閱讀有關'String.replaceAll()'的文檔。它不會用字符串替換字符串。它用字符串替換*正則表達式*。如果你不明白正則表達式是什麼,以及它如何與字符串不同,那麼這是開始查詢的地方。 – BalRog