还有一种不需要添加额外的反斜杠转义符的字符串表示方法,在表达正则表达式和windows文件/目录名时使用它会显得格外方便。
def s = /.*foo.*/ def dirname = /^.*\// def basename = /[^\/]+$/
斜杠字符串只支持\/的转义(在字符串中插入一个斜杠)。这会导致一个问题,就是你将不能直接在斜杠字符串的末尾添加反斜杠(否则Groovy会以为你想对结尾换行符进行转义,以至于认为该字符串还没有结束)。作为替代,可以使用:def bs = '\\\\'; def winpath=/C:\windows\system32$bs/ 或者 def winpath=/C:\windows\system32\${}/。
另外一个注意事项:不要试图使用空的斜杠字符串:def x = / /, 这两个斜杠会被解释成行注释符,而 def z = /${}/ 则不会有问题。
最后一个注意事项:当前,当使用assert断言语句并省略了括号时,斜杠字符串不能出现在该断言表达式的左手边(LHS),例如:
assert 'ab' == 'a' + 'b' // OK, 没有出现斜杠字符串 assert 'a' + 'b' == /ab/ // OK, 斜杠字符串在右手边 assert (/ab/ == 'a' + 'b') // 斜杠字符串出现在断言表达式的左手边时,括号是必须的,至少目前是这样
这是当前语法的一个特性,倒不是期望的目标,也许有一天可以移除这个语法——这是语法中一个令人难以捉摸的边界情况。
更多的例子,请查看 正则表达式。
这个特性可以从下面两个代码片段中看出,你可以复制粘贴到groovyConsole中运行:
st = ["status":"test"] sn = st println sn st.status = "tset" println sn
上面的两个变量都是 map 的引用。
如果你对字符串做同样的事情,行为则是不一样的:
st = "test" sn = st println sn st = "tset" println sn
下面是 Guillaume Laforge 的解释:
在第一个例子中,sn 和 st 都指向内存中的同一个map对象,但是在第二个例子中,到了最后,st 指向了内存中的另一个新的不可变的字符串对象。