在Groovy中使用字符串 - 51CTO.COM

在Groovy中使用字符串 - 51CTO.COM

在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. Hello World

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

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

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

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

  1. s1 = "Hello \"World\" " //Escape double quotes,转义双引号
  2. s2 = 'Hello "World" '
  3. assert s1 == s2
  4. s3 = 'Hello \'World\' ' //Escape single quotes,转义单引号
  5. s4 = "Hello 'World' "
  6. assert s3 == s4
  7. assert new String('Hello World') == "Hello World"
  8. def s = ['h','e','l','l','o'] as char[]
  9. assert new String(s) == 'hello'
  10. assert new String(s,0,4) == 'hell'
  11. s.eachWithIndex{ch,index -> assert ch == s[index]}
  12. assert 'hello'.toCharArray() == ['h','e','l','l','o']

常用的转义符:

  1. assert '\t' == '\011'    //Tab,Tab键
  2. assert '\n' == '\012'    //New line,换行符
  3. assert '\r' == '\015'    //Carriage return,回车
  4. assert '\n' == """
  5. """ //Spanning multiple lines,跨越多行

对象的字符串表示:

  1. def object = new Object()
  2. assert String.valueOf(object) == object.toString() //Objects
  3. assert String.valueOf(true) == true.toString() //Booleans
  4. assert String.valueOf('a') == 'a'.toString() //Characters
  5. assert String.valueOf(1) == 1.toString() //Numbers
  6. assert String.valueOf([a:1,b:2]) == [a:1,b:2].toString() //Collections

字符串长度:

  1. s = "Hello World"
  2. assert s.size() == 11
  3. assert s.size() == s.length()

填充(pad)字符串:

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

分解字符串:

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

查询字符串:

  1. alphabets = new String('a' .. 'z' as char[])
  2. assert alphabets.find{it > 'f'} == 'g' //First one found
  3. assert alphabets.findAll{it > 'f'} == 'g' .. 'z'//ALl found
  4. assert alphabets.findIndexOf{ it > 'f'} == alphabets.indexOf('g')
  5. assert alphabets.every {it > 'A'}
  6. assert alphabets.any{it < 'c'}
  7. assert alphabets.startsWith('abc')
  8. assert alphabets.endsWith('xyz')
  9. assert alphabets.contains('def')
  10. assert alphabets.indexOf('c') == 2
  11. assert alphabets.indexOf('d') == alphabets.lastIndexOf('d')
  12. assert alphabets.count('a') == 1

替换字符串:

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

字符串反转:

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

字符串操作符:

  1. assert 'hello' + ' world' - 'l' == 'helo world' //Subtracts at most one l
  2. assert ('Today is Sunday' - 'Sunday').trim() == 'Today is'
  3. assert 'hello ' * 2 == 'hello hello '
  4. def empty = []
  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. assert Collections.max('abcdeF'.toList(), String.CASE_INSENSITIVE_ORDER) == 'F'
  3. assert Collections.min(['abc','abd','abe']) == 'abc'
  4. assert Collections.min(['Abc','aBd','abE'], String.CASE_INSENSITIVE_ORDER) == 'Abc'

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

  1. def sb = new StringBuffer('Hello World')
  2. assert sb.toString() == 'Hello World'
  3. sb.length = 5
  4. assert sb.toString() == 'Hello'
  5. assert sb.substring(0,2) == 'He'
  6. //Use <<, append(String) or leftShift(String) to append to a StringBuffer.
  7. //Using + to append to a StringBuffer will return a String
  8. sb = new StringBuffer("Hello")
  9. assert sb + ' World' in java.lang.String
  10. assert sb << ' World' in java.lang.StringBuffer
  11. assert sb.toString() == ("Hello World")
  12. assert sb.append(", Groovy rocks").toString() == "Hello World, Groovy rocks"
  13. assert sb.leftShift(". Doesn't?").toString() == "Hello World, Groovy rocks. Doesn't?"

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

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

操作StringBuffers:

  1. sb = new StringBuffer("StringBuffers are mutable")
  2. sb.delete(sb.indexOf(" are mutable"),sb.size())
  3. assert sb.toString() == "StringBuffers"
  4. sb.insert(sb.size(), " are mutable")
  5. assert sb.toString() == "StringBuffers are mutable"
  6. sb.replace(sb.indexOf("StringBuffers"), "StringBuffers".size(), "StringBuilders")
  7. assert sb.toString() == "StringBuilders are mutable"
  8. def string = new String(sb)
  9. def string2 = string.replaceAll("StringBuilders", "StringBuffers")
  10. assert string2 == "StringBuffers are mutable"

正如您看到的,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和负索引(即索引可以是负数,计数从右边开始)。

posted on 2012-09-19 20:35 lexus 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2012/09/19/2694279.html

在Groovy中使用字符串 - 51CTO.COM相关推荐

  1. 在Groovy中使用字符串

    Groovy支持两种类型字符串:一般的Java字符串,它是java.lang.String的实例:和GStrings,它是groovy.lang.GString的实例,并且允许文本中包含占位符.GSt ...

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

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

  3. 如何将Groovy中的文件读入字符串?

    本文翻译自:How to read a file in Groovy into a string? 我需要从文件系统中读取文件并将整个内容加载到groovy控制器中的字符串中,最简单的方法是什么? # ...

  4. Groovy中的闭包

    groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 1.1 定义一个闭包 { [clo ...

  5. Python中的字符串驻留

    C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET不会为这个2 ...

  6. 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )

    文章目录 一.字符串切割 1.使用 Java 语法切割字符串 2.使用 Groovy 语法切割字符串直接为变量赋值 3.数组赋值给变量 变量个数小于等于数组长度 二.完整代码示例 一.字符串切割 在 ...

  7. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = "hello" + ...

  8. 详细介绍JAVA中的字符串

    Java语言中,把字符串作为对象来处理,类String和StringBuffer都可以用来表示一个字符串.(类名都是大写字母打头) 1.字符串常量 字符串常量是用双引号括住的一串字符. "H ...

  9. groovy 变量和字符串

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

最新文章

  1. 虚幻4引擎角色蓝图Character的Movement组件学习
  2. 多任务学习在推荐算法中的应用
  3. 博客园 CSS 代码定制
  4. 前端学习(2860):简单秒杀系统学习之前端优化
  5. vs2017下开发C++MFC动态库实现
  6. PTA c语言 选择法排序过程
  7. 小程序-读取视频数据 每个N帧采样保存
  8. Codeforces Round #518 (Div. 2): F. Knights(神题)
  9. 加密解密:使用对称密码加密文件
  10. linux下find命令-atime,-ctime,-mtime真正含义
  11. pcfg 自然语言处理_自然语言处理:原理简明教程09-句法分析,语义分析和篇章分析...
  12. dede采集简单好用的织梦采集
  13. 【js】js获取今日和昨日0点和23点59分59秒
  14. 数据分析中,还有哪些好用实用的方法论?
  15. Ajax创建步骤内含兼容
  16. UDF、UDAF、UDTF之间的区别
  17. iOS swift5 手动导入SnapKit(不用cocoapods)
  18. 老人与海好词100英文带翻译_The_Old_Man_and_The_Sea_老人与海_中英文对照版_(good)
  19. 2018最新手机cpu排行
  20. java sql 基础_Java SQL基础

热门文章

  1. 区块链与联邦学习综述
  2. 【AngularJs】Angular双向数据绑定
  3. android 5.0官方安装包,Android5.0刷机包怎么安装 Android5.0刷机包安装教程
  4. 费曼技巧:学习任何东西的最佳方法
  5. Java - String是最基本的数据类型吗?
  6. 深入浅出剖析JAVA多线程原理
  7. 免费的静态网页托管_如何使用自动管道免费托管静态站点
  8. Android RadarScanView雷达扫描控件
  9. 导师姻缘牵线,这对博士夫妻:累计一作发15篇论文,毕业留校任教!
  10. 使用node-ffmpeg将m4a转换为mp3