2016-09-26 4 views
0

私はGroovyの初心者です。そして私は少し混乱しています。groovy replaceAll strange behavior

の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」はイコールではありません「引数[0]」 それはGストリング私には思えるし、文字列が異なっています。

問題は長さが異なる理由(「D:\ bin」 - 6、「D:\\ bin」 - 7)ですが、置き換えが行われます。

+0

これは 'GString'とは関係ありません(上の文字列は' GString'です)。 '' 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は異なっています。

これは当てはまりますが、あなたの質問には関係ありません。なぜなら、コード内の文字列はどれもGStringではないからです。

\は、文字列内の特殊文字(タブ、スペースなど)を示すために使用されます。あなたはバックスラッシュ文字を示すために\を使用する場合は、どちらかの余分なバックスラッシュ

def str = 'D:\\bin' 

またはその代わりに、それをエスケープする必要があり、slashy strings代わり

def str = /D:\bin/