groovy替换所有奇怪的行为

时间:2016-09-26 10:30:16

标签: groovy

我是Groovy的新手。我有点困惑。

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和String是不同的。

问题是:为什么长度不同(" D:\ bin" - 6," D:\\ bin" - 7),但更换已完成。

2 个答案:

答案 0 :(得分:1)

  

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

这是事实,但与您的问题无关,因为您的代码中的所有字符串都不是GStrings。

问题是\用于表示字符串中的特殊字符(制表符,空格等)。如果你想使用\来表示反斜杠字符,你需要使用额外的反斜杠来转义它

def str = 'D:\\bin'

或者,使用slashy strings代替

def str = /D:\bin/

答案 1 :(得分:0)

谢谢BalRog。 'str'是一个String,但'args [0]'是正则表达式。