第五章.使用字符串

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 Seattle

Seattle 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

《完》

你可能感兴趣的:(第五章.使用字符串)