一、索引取值
字符串索引从 0 开始
def str = "abcdefg"
println str[-1] // g 获取字符串倒数第一个的值
println str[2] // c
println str[0,2,3] // acd 获取多个下标的值,用“,”号隔开
println str[0..3] // abcd 获取字符串 第一个到第四个的值,可用于截取
println str[0..<4] // abcd 获取字符串 第一个到第四个的值,可用于截取 “《” 指不包含下标4 的那个
println str[4..1] // edcb 从第5个开始 往回截取到 第2个
println str[4..-1] // efg 从第五个开始 截取到 最后一个
二、复制字符串 “*”
注意:字符串中 * 不是算数运算符,不能当乘法用,如 “1”*3
结果应为 : “111”,而不是 3
def str = "陈"
println str*3
//陈陈陈
三、获取长度:str.length() / str.size()
中文字符串、英文、数字字符串长度都只占一个字节,在java 中 中文占2个字节
def str = "大珠小珠落玉盘"
println str.length() //7
def str2 = 'abcd'
println str2.length() //4
四、字符串操作
1、字符串查询:str.indexOf("str2") 返回 字符指定字符首次出现的下标,未查询到则返回-1 。
def str = "大珠小珠落玉盘"
println str.indexOf("珠") //1
//第二个参数表示从哪个下标开始检索
println str.indexOf("珠",4) //-1
2、字符串截取:strs.subString()
str.subString(beginIndex,endIndex) :下标从0开始,属于开闭和空间,即可[beginIndex,endIndex) 解释为:包含beginIndex,不包含 endIndex
def str = "大珠小珠落玉盘"
println str.substring(1) //珠小珠落玉盘 从第二个截取 截取到末尾
println str.substring(0,4) //大珠小珠
3、字符串替换:str.replaceAll("替换元素","值")
def str = "hello world"
str = str.replaceAll("l","a")
println str
//heaao worad
println webVersion.replaceAll("\n","") //替换字符串后面的换行符
def url = "http://www.baidu.com"
println url.replaceAll("http(s)?:","") //替换http:或者https:为空
url = "https://www.baidu.com"
println url.replaceAll("http(s)?:","") //替换http:或者https:为空
4、字符串分割成数组:str.split("分隔符") / str.tokenize("分隔符")
def str = "hello world"
println str.split("l")
//返回数组,允许保留空字符串 [he, , o wor, d]
println str.tokenize("l")
//返回list,不会保留空字符串 [he, o wor, d]
5、大小写转换:str.toUpperCase()、str.toLowerCase()
def str = "hello-World"
println str.toUpperCase() //HELLO-WORLD
println str.toLowerCase() //hello-world
6、字符串忽略大小写比较:str.compareToIgnoreCase("str2")
def str = "hello-world"
def str2 = "HELLO-WORLD"
def str3 = "hello-w"
def str4 = "hello-worldaa"
println str.compareToIgnoreCase(str2) //0 等于
println str.compareToIgnoreCase(str3) //4 str 大
println str.compareToIgnoreCase(str4) //-2 str 小
7、判断是否以指定字符串开头/结尾:str.startsWith("xx") / str.endsWith("xx")
def str = "hello-world"
println str.startsWith("he") //true
println str.startsWith("hd") //false
println str.endsWith("ld") //true
println str.endsWith("0d") //false
8、字符串的拼接 :str +=str2 / str = str.concat(str2)
def str = "hello"
str+="world"
//或者 str = str.concat("world")
println str
//helloworld
9、字符串删除: str -= str2
def str = "hello world"
str-="ld"
println str // hello wor
10、统计指定字符串出现的次数:str.count("xx")
def str = "hello world"
println str.count("l") //3
11、查询是否包含某字符串:str.contains("xx")
def str = "hello world"
println str.contains("ld") //true
12、判断是否为数字
def str = '1106502'
if(!str.isInteger() && !str.isFloat()) {
println "不是数字"
}else{
println "是数字"
}
println str
//是数字
//1106502
五、其他
1、闭包
def clos={param -> println "Hello ${param}"}
clos('World') //Hello World
//或者cols.call('World')
//使用隐参数it
clos={println "Hello ${it}"}
clos('World') //Hello World
2、异常处理
try {
}catch(Exception err) {
throw new Exception("*******Caught an exception: ${err}")
}
//不抛出异常
try {
} catch (ignored) {
}
3、单引号、双引号、三引号的区别
def str = "张三"
//单引号字符串,字符串会被原样输出,不进行变量替换或转义字符处理
println 'Hello,${str}' //Hello,${str}
//双引号字符串,可以进行变量替换和字符串插值。这意味着可以在字符串中嵌入变量或表达式
println "Hello,${str}" //Hello,张三
//三重双引号字符串允许多行文本,并支持字符串插值和转义字符,进行鸳鸯输出
str2 = """
1
222
33333
44444444
5555555555
666666666666
77777777777777
"""
println str2
//输出结果
1
222
33333
44444444
5555555555
666666666666
77777777777777
4、默认值赋值-Elvis 运算符
class Foo{
def name = "123"
}
def foo = new Foo()
println foo.name ?:"bob" //123 如果有值,则为值,类似于三元运算符
//println foo.name == null ? "bob" : foo.name
class Foo2{
def name
}
def foo1 = new Foo2()
println foo1.name ?:"bob" //bob 如果空或者null 则默认为 bob
5、避免空指针-安全解引用操作符?
//此操作符用来避免发生空指针异常的情况,只需要在语句里面添加一个问号(?)即可,看例子。
String name = person?.getName()
//当 person 为 null 时,对应的name 属性也设置为 Null。同样,对方法调用也同样适用。
6、使用工具类
(1) ConfigSlurper
ConfigSlurper实用类用来读取配置信息,它是一种 Groovy 脚本。像 Java 中的*.properties的文件,可以使用“.”导航符进行访问,它也可以应用在闭包的配置的值和任何对象类型中。
def config = new ConfigSlurper().parse('''
appid = '93772j23ysk29vu3m'
secret = 'r2y4j56lj2h00l212g56j34fi23ud8h29123d87kvnc2'
app.date = new Date()
app.version = 3.1
app.name = '愉快办'
app {
desc = "这是一个很好的app,它的名字叫做${app.name}"
}
''')
def properties = config.toProperties()
println "appid is ${properties.appid}"
println "app.date is ${properties.'app.date'}"
println "app.desc is ${properties.'app.desc'}"
//输出结果
appid is 93772j23ysk29vu3m
app.date is Thu Jan 11 11:52:47 CST 2024
app.desc is 这是一个很好的app,它的名字叫做愉快办
(2) Expando
xpando工具类用来创建动态扩展对象。你可以为对象添加属性和方法,在动态元编程中此类非常实用
def ex = new Expando()
ex.name = "Dark"
// 或者 ex.name = { -> "Dark"}
ex.say = {String str -> "${ex.name} says:${str}"}
def say = ex.say('hello')
println say //Dark says:hello
(3) PropertyChangeEvent
Groovy 提供了可供观察的 List,Map和 Set。当这些集合在新增,删除,修改元素时会触发PropertyChangeEvent( java.beans package)事件。需要注意的是,这个事件不仅会触发,它还持有属性的名字以及属性的新旧值。
def observ = new ObservableList()
observ << '124'
observ << 'qwe'
println observ
//[124, qwe]
def listen = {e->
println e
println "newValue is ${e.newValue},oldValue is ${e.oldValue}"
}
observ.addPropertyChangeListener(listen)
observ[0] = "zhangsan"
observ[1] = "lisi"
println observ
//输出结果
groovy.util.ObservableList$ElementUpdatedEvent[propertyName=content; oldValue=124; newValue=zhangsan; propagationId=null; source=groovy.util.ObservableList@a8eb98cc]
newValue is zhangsan,oldValue is 124
groovy.util.ObservableList$ElementUpdatedEvent[propertyName=content; oldValue=qwe; newValue=lisi; propagationId=null; source=groovy.util.ObservableList@a91c9260]
newValue is lisi,oldValue is qwe
[zhangsan, lisi]