2016-09-26 87 views
0

我是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),但替換完成。

+0

這與'GString'無關(上面的字符串都不是'GString's)。試試:''D:\\ bin'.replaceAll('D:\\\\ bin','C:\\ data')'這是一個轉義問題 –

+0

,你可以看到它正在工作。但奇怪的行爲。查看結果newStr是'C:\ data',但args [1]是'C:\\ data'。字符串不同而且長度不同。 –

+1

閱讀有關'String.replaceAll()'的文檔。它不會用字符串替換字符串。它用字符串替換*正則表達式*。如果你不明白正則表達式是什麼,以及它如何與字符串不同,那麼這是開始查詢的地方。 – BalRog

回答

0

感謝BalRog。 'str'是一個字符串,但'args [0]'是一個正則表達式模式。

1

在我看來,GString和String是不同的。

這是真的,但與您的問題無關,因爲您的代碼中的字符串都不是GStrings。

問題是\用於表示字符串中的特殊字符(製表符,空格等)。如果你想使用\來表示一個反斜槓字符您可能需要一個額外的反斜槓

def str = 'D:\\bin' 

或備選地逃避它,使用slashy strings代替

def str = /D:\bin/