在Groovy中使用字符串

2009-06-15 16:53 wonderlandsh JavaEye博客 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!
本文介绍了Groovy的数据类型和控制结构中的字符串。Groovy支持两种类型字符串:一般的Java字符串,以及GStrings。本文的例子中详细解释了两种字符串各自的用法。 AD:51CTO云计算架构师峰会 抢票进行中!

Groovy支持两种类型字符串:一般的Java字符串,它是java.lang.String的实例;和GStrings,它是groovy.lang.GString的实例,并且允许文本中包含占位符。GStrings并不是String的子类,因为String类是最终类(final class)不能被继承。然而,GString与一般的字符串一样,因为Groovy能将GStrings转型为Java strings。

GString 适用于编写模板代码(templating),因为您必须动态构建字符串(GStrings are useful in templating situations where you have to build your string dynamicly)。以下的清单给出了一个例子。

使用GStrings:

  1. firstWord='Hello'
  2. secondWord='dlroW'
  3. println"$firstWord${secondWord.reverse()}"

结果如下:

  1. HelloWorld

GStrings不同于Java strings在于它们允许以${..}的语法嵌入变量。如果一个字符串由双引号或三重引号括起来,并且包含一个非转义符(unescaped)$,它必定是groovy.lang.GString的一个实例;否则,就是java.lang.String的一个实例。

${..}里可以包含任意有效的Groovy表达式,包括方法调用或变量名。只有调用GString的toString方法时(例如,把结果输出到控制台),${..}表达式才被求值。

Groovy支持的另一种字符串便是java.lang.String。然而,GDK还是动态注入许多帮助方法,使其易于应用。

以下的例子展示了在Groovy中声明一个字符串的不同方式:

  1. s1="Hello\"World\""//Escapedoublequotes,转义双引号
  2. s2='Hello"World"'
  3. asserts1==s2
  4. s3='Hello\'World\''//Escapesinglequotes,转义单引号
  5. s4="Hello'World'"
  6. asserts3==s4
  7. assertnewString('HelloWorld')=="HelloWorld"
  8. defs=['h','e','l','l','o']aschar[]
  9. assertnewString(s)=='hello'
  10. assertnewString(s,0,4)=='hell'
  11. s.eachWithIndex{ch,index->assertch==s[index]}
  12. assert'hello'.toCharArray()==['h','e','l','l','o']

常用的转义符:

  1. assert'\t'=='\011'//Tab,Tab键
  2. assert'\n'=='\012'//Newline,换行符
  3. assert'\r'=='\015'//Carriagereturn,回车
  4. assert'\n'=="""
  5. """//Spanningmultiplelines,跨越多行

对象的字符串表示:

  1. defobject=newObject()
  2. assertString.valueOf(object)==object.toString()//Objects
  3. assertString.valueOf(true)==true.toString()//Booleans
  4. assertString.valueOf('a')=='a'.toString()//Characters
  5. assertString.valueOf(1)==1.toString()//Numbers
  6. assertString.valueOf([a:1,b:2])==[a:1,b:2].toString()//Collections

字符串长度:

  1. s="HelloWorld"
  2. asserts.size()==11
  3. asserts.size()==s.length()

填充(pad)字符串:

  1. assert'Hello'.padRight(7,'*')=='Hello**'
  2. assert'Hello'.padLeft(7,'*')=='**Hello'
  3. assert'Hello'.center(9,'*')=='**Hello**'

分解字符串:

  1. s="Thequickbrownfoxjumpsoverthelazydog"
  2. asserts.tokenize()==['The','quick','brown','fox','jumps','over','the','lazy','dog']
  3. asserts.tokenize()==newStringTokenizer(s).collect{it}
  4. s1="The,quick*brown*fox,*jumps*over*the*lazy*dog"
  5. asserts1.tokenize(',*')==s.tokenize()

查询字符串:

  1. alphabets=newString('a'..'z'aschar[])
  2. assertalphabets.find{it>'f'}=='g'//Firstonefound
  3. assertalphabets.findAll{it>'f'}=='g'..'z'//ALlfound
  4. assertalphabets.findIndexOf{it>'f'}==alphabets.indexOf('g')
  5. assertalphabets.every{it>'A'}
  6. assertalphabets.any{it<'c'}
  7. assertalphabets.startsWith('abc')
  8. assertalphabets.endsWith('xyz')
  9. assertalphabets.contains('def')
  10. assertalphabets.indexOf('c')==2
  11. assertalphabets.indexOf('d')==alphabets.lastIndexOf('d')
  12. assertalphabets.count('a')==1

替换字符串:

  1. s="Hello"
  2. asserts.replace('H','Y')=='Yello'
  3. asserts.replace('l','p')=='Heppo'

字符串反转:

  1. s='mirror'
  2. asserts.reverse()=='rorrim'

字符串操作符:

  1. assert'hello'+'world'-'l'=='heloworld'//Subtractsatmostonel
  2. assert('TodayisSunday'-'Sunday').trim()=='Todayis'
  3. assert'hello'*2=='hellohello'
  4. defempty=[]
  5. assert'abc'.each{empty<<it}=='abc'
  6. assert'abc'.next()=='abd'
  7. assert'abc'.previous()=='abb'

下标操作符:

  1. assert'hello'[1]=='e'
  2. assert'hello'[2..'hello'.size()-1]=='llo'
  3. assert'hello'[0,2,4]=='hlo'
  4. assert'hello'[-4,-2]=='el'

字符串比较:

  1. assert'a'<'b'
  2. assert'a'>'A'
  3. assert'a'.compareTo('b')==-1
  4. assert'a'.compareToIgnoreCase('A')==0

寻找最大值和最小值:

  1. Collections.max('abcdeF'.toList())=='e'
  2. assertCollections.max('abcdeF'.toList(),String.CASE_INSENSITIVE_ORDER)=='F'
  3. assertCollections.min(['abc','abd','abe'])=='abc'
  4. assertCollections.min(['Abc','aBd','abE'],String.CASE_INSENSITIVE_ORDER)=='Abc'

StringBuffers和StringBuilders是可变的,允许字符串改变。StringBuilder不是线程安全的,因此处理速度要比StringBuffers快。

  1. defsb=newStringBuffer('HelloWorld')
  2. assertsb.toString()=='HelloWorld'
  3. sb.length=5
  4. assertsb.toString()=='Hello'
  5. assertsb.substring(0,2)=='He'
  6. //Use<<,append(String)orleftShift(String)toappendtoaStringBuffer.
  7. //Using+toappendtoaStringBufferwillreturnaString
  8. sb=newStringBuffer("Hello")
  9. assertsb+'World'injava.lang.String
  10. assertsb<<'World'injava.lang.StringBuffer
  11. assertsb.toString()==("HelloWorld")
  12. assertsb.append(",Groovyrocks").toString()=="HelloWorld,Groovyrocks"
  13. assertsb.leftShift(".Doesn't?").toString()=="HelloWorld,Groovyrocks.Doesn't?"

您也可以对StringBuffer或StringBuilder使用下标,如:

  1. sb=newStringBuffer("abcdefg")
  2. assertsb[0]=='a'
  3. assertsb[2..4]=='cde'
  4. assertsb[0].class==String
  5. assertsb[-6..-4]=="bcd"
  6. sb[0..2]="xyz"
  7. assertsb.toString()=="xyzdefg"

操作StringBuffers:

  1. sb=newStringBuffer("StringBuffersaremutable")
  2. sb.delete(sb.indexOf("aremutable"),sb.size())
  3. assertsb.toString()=="StringBuffers"
  4. sb.insert(sb.size(),"aremutable")
  5. assertsb.toString()=="StringBuffersaremutable"
  6. sb.replace(sb.indexOf("StringBuffers"),"StringBuffers".size(),"StringBuilders")
  7. assertsb.toString()=="StringBuildersaremutable"
  8. defstring=newString(sb)
  9. defstring2=string.replaceAll("StringBuilders","StringBuffers")
  10. assertstring2=="StringBuffersaremutable"

正如您看到的,GDK在java.lang.String,java.lang.StringBuffer和java.lang.StringBuilder基础上添加了很多实用的方法。前面的例子只讨论部分方法,因此推荐您查看String的API文档,http://groovy.codehaus.org/groovy-jdk/java/lang/String.html;StringBuffer, http://groovy.codehaus.org/groovy-jdk/java/lang/StringBuffer.html; StringBuilder, http://groovy.codehaus.org/groovy-jdk/java/lang/StringBuilder.html。

在Groovy中使用字符串时,需要注意以下几点:

与Java一样,Groovy中的字符串也是不可变的(即只读的)。欲改变字符串值需使用StringBuffer或StringBuilder。

Groovy中,如果字符串如果由单引号括起来,或者由双引号或三重引号括起来但没有非转义的美元符号($),那么该字符串是java.lang.String的一个实例。您可使用JDK中任意字符串方法。另外,GDK动态注入额外的实用方法到String类。

由于Groovy会自动转型为String类,您可以在任何时候使用GStrings。

字符串可被单引号,双引号或者三重引号括起来。其中,三重引号可直接跨越数行并且输出中仍包含回车符、制表符和空格符。

Groovy使用size方法来查询一个字符串,StringBuffer或StringBuilder的长度,与查询一个集合的长度相统一。

某些字符串方法接受闭包,它明确说明需要满足的条件,例如,find,findAll,findIndexOf,every和any。这些方法都是由GDK动态注入到java.lang.Object中的。

您可以使用collect,each或者eachWithIndex方法遍历字符串,而且这些方法也属于java.lang.Object的一部分。

您可对字符串使用操作符。操作符“+”完成字符串联接;“-”则最多去掉一个右操作数的实例;“*”按照给定的数字复制字符串;next实现字符串最后一个字节自增;previous实现字符串最后一个字节自减。

您可对Strings,StringBuffers和StringBuilders使用下标操作符,也可以在下标操作符中使用range和负索引(即索引可以是负数,计数从右边开始)。

标签 , , ,

发表回复