Groovy 字符串

官方文档:http://www.groovy-lang.org/syntax.html

Groovy有java.lang.String和groovy.lang.GString两种字符串对象类型,具体如下

单引号字符串

单引号字符串是java.lang.String类型的,不支持占位符插值操作

def name = 'Groovy!'
def body = 'test $name'println(body); //test $name,不是 test Groovy!

Groovy的字符串可以通过 "+" 直接拼接

assert 'groovy' == 'g' + 'roo' + 'vy';
println('ab\'' + 'f');  // ab'f

转义字符规则同Java一样

三重单引号字符串

三重单引号字符串也是java.lang.String类型的,不支持占位符插值操作,可以表示多行字符串

def str = '''line one
line two
line three'''

如果在换行之前加个,则相当于没有换行

def str = '''\
line one aaa \n kkkk
line tow 2\
line three'''
println(str);

运行结果:

line one aaa kkkk
line tow 2line three

双引号字符串

双引号字符串支持占位插值操作,如果双引号字符串中不包含占位符则是java.lang.String类型的,如果包含则是groovy.lang.GString类型的。

占位符可以用${}$来表示,${}用于替换一般字符串或表达式,$主要用于A.B的形式中

// ${}
def str1 = 'Groovy!'
def str2 = "hello ${str1}"
println(str2);  // hello Groovy!def str3 = "the sum of 2 and 3 is ${2 + 3}"
println(str3);  // the sum of 2 and 3 is 5// $
def str4 = "hello $str1"
println(str4);  // hello Groovy!def map = ['name':'Tom', 'age':null, 'gender':null]
println("$map.name is $map.age years old, gender $map.gender"); // Tom is null years old, gender null

$ 只对a.b或a.b.c形式有效,如果表达式包含括号类似于方法调用、闭包的大括号或算术运算符是无效的。

def str = "wzx"
println("my name length is ${str.length()}");  //my name length is 3println("my name length is $str.length()");
//该代码运行抛出groovy.lang.MissingPropertyException异常,因为Groovy认为去访问num的toString的属性,所以异常def closure = {"sum " + it};
def str1 = "2 + 3 = ${closure(5)}"
def str2 = "2 + 3 = $closure(5)"
println(str1);  // 2 + 3 = sum 5
println(str2);  // 2 + 3 = (5) 错误

注意,在表达式中访问属性前必须保证属性已经定义好(值为空也可以),如果使用了未定义的属性会抛出groovy.lang.MissingPropertyException异常

如果需要表示$ or ${}字符串,可以使用反斜杠\

assert '${name}' == '\${name}'

插值闭包表达式的特殊情况

到目前为止,我们已经可以在${}占位符插值任意表达式。但是对于闭包有一个特殊情况和符号,占位符包含一个箭头${→}时,表达式实际上是一个闭包表达式,可以认为它是一个闭包前缀了一个美元符号:

//无参闭包
def strWithNoParmClosure = "2 + 3 = ${ -> 5}"  // 2 + 3 = 5
//带有一个 java.io.StringWriter 参数的闭包,可通过 << 操作符将内容传给参数
def strWithParmClosure = "1 + 2 != ${parm -> parm << 'six'}"  // 1 + 2 != six

以上两种都是占位符插值闭包的情况,看起来比单纯的表达式定义麻烦,但是闭包有一个特性:延迟运算(lazy evaluation)

def number = 1;
def eargeGString = "value = ${number}"
def lazyGString = "value = ${ -> number}"assert eargeGString == "value = 1"
assert lazyGString == "value = 1"number = 2;
assert eargeGString == "value = 1"
assert lazyGString == "value = 2"

对于普通插值表达式(eargeGString),其值实际在表达式创建时就被绑定了,如:

def num1 = 9, num2 = 11;
def fun(int p1, int p2){p1 + p2
}
def strWithParmClosure = "xxx ${fun(num1, num2)}";println(strWithParmClosure);  // xxx 20num2 = 20;
println(strWithParmClosure);  //xxx 20

但是对于有闭包的表达式,在每次GString转成String时闭包都会被调用。

插值闭包表达式中的闭包只允许有0或1个参数,否则运行时会抛异常

groovy> def strWithParmClosure = "2 + 3 != ${parm, parm2 -> (parm << 2) + (parm2 << 3)}";
groovy> println(strWithParmClosure); 

运行时异常:

groovy.lang.GroovyRuntimeException: Trying to evaluate a GString containing a Closure taking 2 parameters

GString & String hashCodes

String是不可变的,GString的String表示会根据插值变化,即使String和GString有相同的字符串,其hashCode也不同

assert "one: ${1}".hashCode() != "one: 1".hashCode()

所以应该避免使用GString作为Map key,例如:

def key = "a"
def m = ["${key}": "letter ${key}"] assert m["a"] == null   //由于key的HashCode不同,所以取不到

三重双引号字符串

三重双引号字符串表现得像双引号字符串,另外它们是多行的

def name = 'Groovy'
def template = """Dear Mr ${name},\You're "the winner" of 'the lottery'!Yours sincerly,\Dave\"AAABBBB\\"
"""assert template.contains("Groovy")
println(template);

运行结果:

...第一行为空行Dear Mr Groovy,    You're "the winner" of 'the lottery'!Yours sincerly,    Dave"AAABBBB\"

斜线字符串

使用/作为分隔符,Slashy字符串对于定义正则表达式和模式特别有用,因为没有必要转义反斜杠。

前斜线与单引号:

def fooPattern = /.*foo.*/
assert fooPattern == '.*foo.*'

若在斜线字符串中要使用前斜线,需要用反斜线转义

def escapeSlash = /The character \/ is a forward \t slash  //用反斜线转义前斜线,而反斜线可直接写入,适用于正则式assert escapeSlash == 'The character / is a forward \\t slash'  //单引号等其他字符串前斜线不需要转义

可表示多行字符串

def multilineSlashy = /one\twothree/assert multilineSlashy.contains('\n')
println(multilineSlashy)

运行结果:

one    twothree

支持插入占位符

def color = "blue"
def interpolatedSlashy = /a ${color} car/assert interpolatedSlashy == /a blue car/
println(interpolatedSlashy)

需要注意的问题:

一个空的slashy字符串不能用双斜杠表示,因为它被Groovy解析器理解为一行注释,下面的断言实际上不会被编译,因为它被认为是一个未结束语句:

def color = ''
assert color == //

由于slashy字符串的设计主要是为了使regexp更容易,因此在GStrings中有一些错误,比如$(),在slashy字符串中可以使用

def slashy = /a $() car/
assert slashy == "a \$() car"  // GString中$需要转义

String比较

转载于:https://www.cnblogs.com/zhaoxia0815/p/7391070.html

Groovy 字符串相关推荐

  1. groovy 字符串截取最后一个_Python入门高级教程--Python 字符串

    Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello W ...

  2. groovy 字符串截取最后一个_Java基础篇——字符串详解

    字符串的声明 字符串是内存中连续排列的0个或多个字符.不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找.比较.拼接等操作时 ...

  3. groovy 字符串截取最后一个_python数据类型总结——数字和字符串

    如同人有姓名一般,当python中的数据被创建后,会在存储介质中分配一块区域用于存储数据.通常,我们需要一个名字来指代这部分数据.python变量 数据的名字,称之为变量.数据存放在内存空间中,变量持 ...

  4. 【Groovy】字符串 ( 字符串注入函数 | asBoolean | execute | minus )

    文章目录 一.字符串注入函数 1.字符串转布尔值 asBoolean 函数 2.执行字符串对应命令 execute 函数 3.字符串减法 minus 函数 二.完整代码示例 一.字符串注入函数 Gro ...

  5. 【Groovy】字符串 ( 字符串类型变量定义 | 字符类型变量定义 )

    文章目录 一.字符串类型变量 二.字符类型变量 三.完整代码示例 一.字符串类型变量 使用 def 关键字声明 Groovy 中的 变量 : 声明字符串 , 可以使用以下方式 : // 字符串 // ...

  6. groovy 变量和字符串

    1. 变量 1.1 变量类型 Groovy变量没有基本类型变量,所有的变量都是对象类型.在定义变量的时候,无论定义类型是基本类型还是对象类型,最后都会被统一转换成对象类型. int x = 10pri ...

  7. groovy if 判断字符串_Groovy(二)-字符串

    文本是由一连串的字符也就是字符串组成,Groovy让你实例化java.lang.String实体,和其他编程语言中的内插字符串GStrings (groovy.lang.GString)一样. 单引号 ...

  8. Groovy使用字符串

    字面常量与表达式 Groovy可以使用单引号创建字符串字面常量,比如'hello'.而java中,'a'是一个char,"a"才是一个String对象,Groovy中没有这样的分别 ...

  9. 《Groovy语言规范》-语法

    原文链接  译者:王山山 语法 本章节涵盖了Groovy编程语言的语法.Groovy语言的语法源自Java语法,为Groovy增强了特定构造,允许一定程度上的简化语法. 1.注释 1.1.单行注释 单 ...

最新文章

  1. css毛玻璃效果白边_CSS3毛玻璃效果(blur)有白边问题的解决方法
  2. [CSAcademy]A-Game
  3. nyoj1180Maze
  4. php判断ie版本,PHP获取浏览器版本信息
  5. C++11使用互斥量保护共享数据
  6. 计算机网络在我国的发展,04. 当前现状ISP典型架构 计算机网络在我国的发展
  7. 打印服务器协议,基于TCP/IP协议的嵌入式网络打印服务器设计
  8. WordPress WP cleanfix插件‘eval()’函数跨站请求伪造漏洞
  9. 阿里题目:明星群众问题
  10. leetcode691:Stickers to Spell Word
  11. Spring mvc创建的web项目,如何获知和修改其web的项目访问链接名称?
  12. 微信小程序踩坑- tabBar.list[3].selectedIconPath 大小超过 40kb
  13. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
  14. Python制作任意音频文件
  15. 南方人才市场档案挂靠告诉你:没有档案会怎样?
  16. 正在移除icloud数据久_深度梳理一下iOS照片(相册)的逻辑,和减少iCloud的空间占用的方法...
  17. linux ip添加secondary ip,linux 添加secondary ip
  18. 二十九、K8s最小服务漏洞3-gVisor沙箱
  19. 【word基础操作】如何在word中为公式编号
  20. python --windos系统托盘

热门文章

  1. 一只鸟就这样耍弄了一个人
  2. PPT幻灯片演示模式设置
  3. AngularJS 事件绑定(ng-click)
  4. Git命令全解析-前端备忘录
  5. 味知香VS千味央厨,谁是年夜饭C位?
  6. UGUI之菜单动画效果制作思路
  7. react二级路由的两种方法
  8. 仿xp画板、画图重绘、五子棋总结
  9. autorun.vbs病毒的清除办法
  10. mysql replicator_聊聊rocketmq-mysql的Replicator