第五章.使用字符串
5.1、字面常量与表达式
a、字符声明:
如果想要表示一个字符,只需要这样声明:
char aChar='a' as char
println aChar.getClass().name//打印java.lang.Character
b、单引号字符串
不同与Java,Groovy中可以使用单引号(当然双引号也可以)创建字符串常量,单引号和双引号还可以混合使用,但是需要正确嵌套:
def sentence='he said "hello!"'
println sentence//打印he said "hello!"
println sentence.getClass().name//打印java.lang.String
与双引号创建的字符串不同,单引号创建的字符串会被当成一种纯粹的字面常量,因此不能求值(在字符串中引用其他变量,引用方式为$variable或者${variable}(变量可不带大括号,表达式带大括号)),例子:
代码调用:
def value=25
def singleQuoteString='the value is ${value}'
println singleQuoteString
def doubleQuoteString="the value is${value}"
println doubleQuoteString
结果:
the value is ${value}
the value is 25
注意:如果需要显示$符号,需要转义\$
Java中字符串是不可变的,groovy也遵守这一规则,一旦创建,不可修改,只能读取。例子:
代码调用:
def finalString="I can not be modified !"
println finalString[0]
try{
finalString[1] =110
}catch(Exception ex) {
println "sorry I can not change the value "
println ex.message
}
结果:
I
sorry I can not change the value
No signature of method: java.lang.String.putAt() is applicable for argument types: (java.lang.Integer, java.lang.Integer) values: [1, 110]
Possible solutions: putAt(java.lang.String, java.lang.Object), getAt(int), getAt(int), getAt(groovy.lang.EmptyRange), getAt(java.lang.String), getAt(groovy.lang.Range)
c、斜线字符串
两斜杠也可以创建字符串,用法与双引号创建的字符串类似。与之不同的是:
def slashString=/I am slash String/
println slashString
def singleSlashString=/the value is$value/
println singleSlashString
d、各类符号('',"",//)创建字符串的差异,例子:
方法定义:
def printClass(obj){
println obj.getClass().name
println obj.getClass().superclass.name
println '----'
}
代码调用:
def v=20
printClass('singleQuote without value')
printClass("doubleQuote without value")
printClass("doubleQuote with value$v")
printClass(/slash without value/)
printClass(/slash with vlaue$v/)
结果:
Class is java.lang.String
SuperClass is java.lang.Object
Class is java.lang.String
SuperClass is java.lang.Object
Class is org.codehaus.groovy.runtime.GStringImpl
SuperClass is groovy.lang.GString
Class is java.lang.String
SuperClass is java.lang.Object
Class is org.codehaus.groovy.runtime.GStringImpl
SuperClass is groovy.lang.GString
总结:带有变量引用的字符串实际是Gstring的实例,其他类型字符串是Java中String的实例。
5.2、Gstring的惰性求值问题
如果希望改变表达式中使用的引用,而且希望他们的当前值被用于惰性求值中,不要在表达式中直接替换,而是使用无参闭包。例子:
company='Google'
price=222
def quote="Today ${->company} stock closed at ${->price}"
println quote
def stocks=[Apple:663.01,Microsoft:30.95]
stocks.each{key,val->
company=key
price=val
println quote
}
5.3、多行字符串
在groovy中,使用一对三个单引号(或三个双引号)即可创建多行字符串。例子:
def multilineString='''I am
a string
with many lines'''
println multilineString
def value=25
def multilineStringWithValue="""I am
a string
with many lines
with value$value"""
println multilineStringWithValue
结果:
I am
a string
with many lines
I am
a string
with many lines
with value "25"
另:多行字符串(只支持三个双引号)支持求值操作。
5.4、字符串便捷方法
GString对操作符进行了重载,使得变换字符串非常容易(包括minus (-),plus (+),multiply(8),next(++),replaceAll()和tokenize()。例子:
de fstr="It's a rainy day in Seattle"
println str
str-="rainy"
println str
def sentence="Seattle "
println sentence*3
println sentence+2*3
结果:
It's a rainy day in Seattle
It's a day in Seattle
Seattle Seattle SeattleSeattle 6
Groovy还可以对一些字符串(有一定规律)进行迭代:
for(String i in 'held'..'helm') {
print i
print" "
}
结果:
held hele helf helg helh heli helj helk hell helm
5.5、正则表达式
1、要从字符串创建模式,使用~操作符在字符串前面。
2、要定义一个RegEx,使用正斜杠;
3、要确定是否存在匹配,使用=~;
4、对于精确匹配使用==~;
如:
def pattern= ~"(H|h)ello"
def text='Hello world'
if(text=~pattern) {//模式在后,字符串在前
println 'match'
}else{
println 'not match'
}
if(text ==~ pattern) {//模式在后,字符串在前
println 'match'
}else{
println 'not match'
}
if(text=~/(H|h)ello/) {//RegEx在后,字符串在前
println 'match'
}else{
println 'not match'
}
结果:
match
not match
match
《完》