Groovy字符串及其常用方法

文本文字以字符鏈的形式表示被稱作字符串。腳本語言在字符串處理方面比主流的應用程序開發語言做的更好。Groovy就提供了許多附加的特性。在Groovy中有兩種風格的字符串:String(java.lang.String)和GString(groovy.lang.GString)。GString允許有佔位符而且允許在運行時對佔位符進行 解析和計算。

字符串方法

與java不同,在GString中提供了多種表示字符串的方法,分別是單引號字符串、雙引號字符串、三單引號字符串、三雙引號字符串、斜槓字符串和$修飾的斜槓字符串。

單引號字符串

單引號字符串是一系列被單引號包圍的字符,是普通的java.lang.String。不支持插值。

def str = 'groovy'
assert str.class == java.lang.String

三單引號字符串

三單引號字符串是一列被三個單引號包圍的字符,是普通的java.lang.String。不支持插值。

def str = '''groovy'''
assert str.class == java.lang.String

三單引號字符串是多行的。你可以使字符串內容跨越行邊界,不需要將字符串分割爲一些片段,不需要連接,或換行轉義符:

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

//需要注意的是,這個字符串每一次換行都包含了一個換行轉義符:

assert str.contains("\n") == true
assert str.size() == 14

//可以通過使用反斜槓換行符剝離該字符

def str = '''\
one\
two\
three'''

assert str.contains("\n") == false
assert str.size() == 11

雙引號字符串

雙引號字符串是一列被雙引號包圍的字符,如果沒有插值表達式,雙引號字符串就是普通的java.lang.String。如果有插值存在則是groovy.lang.GString實例:
任何Groovy表達式可以在所有字符文本進行插值,除了單引號和三單引號字符串。插值是使用佔位符上的字符串計算值替換佔位符的操作。佔位符表達式是被 的表達式。當GString被傳遞給一個帶有一個String參數的方法時,佔位符的表達式被計算值,並通過調用表達式的toString()方法以字符串形式表示。
這裏是一個佔位符引用局部變量的字符串:

def name = 'Groovy'
def greeting = "Hello ${name}"

assert greeting.toString() == 'Hello Groovy'


//而且任何Groovy表達式是合法的,正如我們在示例中使用算數表達式所見一樣:
def sum = "The sum of 2 and 3 equals ${2 + 3}"
assert sum.toString() == 'The sum of 2 and 3 equals 5'

//除了${}佔位符以外,也可以使用$作爲表達式前綴:
def person = [name: 'Guillaume', age: 36]
assert "$person.name is $person.age years old" == 'Guillaume is 36 years old'

//空${}佔位符等於null
assert "demo${}" == "demonull"

//如果在GString中你需要轉義$或${}佔位符,使它們不出現插值,那麼你只需要使用反斜槓字符轉義美元符號:
assert '${name}' == "\${name}"

當佔位符包含一個箭頭時:${->}。表達式實際上是一個閉包表達式:

name = "zhangsan"
assert "${->name}" == "zhangsan"

延遲加載

嵌入的閉包表達式僅僅允許攜帶0或者1個參數。
閉包作爲表達式比普通插值表達式有一個很有用的特性:延遲加載。

 def b = 'old'
 def value1 = "${b}"
 def value2 = "${->b}"
 assert value1 == "old"
 assert value2 == "old"

 b = "new"
 assert value1 == "old"    //使用純插值表達式,結果在GString創建時結合
 assert value2 == "new"    //但使用閉包表達式,GString被強轉爲Sring時,閉包被調用,併產生包含新數值的更新字符串。

GString和String的hascode不同

雖然插值字符串可以代替普通Java字符串,字符串相同的兩者還是有區別:它們的hashCode是不同的。普通Java字符串是不可變的,而一個GString依賴於插入的值,它的String是可變的。即使有相同的字符串結果,GString和String也沒有相同的hashCode。

def key = "a"
def m = ["${key}": "letter ${key}"]  //map被一個初始化鍵值對創建,其鍵值是GString

assert m["a"] == null   //當我們嘗試使用String鍵值獲取值時,我們並沒獲取對應值,因爲String和GString有不同的hashCode

三雙引號字符串

三雙引號字符串與雙引號字符串相同,增加多行,像三單引號字符串一樣。

斜槓字符串

除了通常的帶引號字符串,groovy提供斜槓字符串,使用/作爲分隔符。斜槓字符串對於定義正則表達式和模式是特別有用的,因爲不需要轉義反斜槓。只有正斜槓需要反斜槓轉義。斜槓字符串支持多行,支持插值。

字符串方法

Groovy通過包含附加方法的方法擴展了JDK中的類:center、getAt、leftShift等等。

//String center(Number numberOfChar)  返回一個長度爲numberOfChar,其左邊和右邊均使用空格的填充的新字符串。
def str = "demo"
assert str.center(6) == " demo "
assert str.center(6).size() == 6
assert str.center(5) ==  "demo "    //如果numberOfChar比字符串長度大1.那麼在原字符串後添加一個空格。

//String center(Number numberOfChar,String padding)  返回一個長度爲numberOfChar,其左邊和右邊均使用padding的填充的新字符串,與上一個一致:如果第一個參數比字符串長度大1,在元字符串後添加padding
assert str.center(5,"a") == "demoa"
assert str.center(7,"ab") == "ademoab"      //先在元字符串後添加padding的前一個字符,再在原字符串前添加padding的前一個字符。然後在新字符串後添加padding的第二個字符,以此類推。

//int compareToIgnoreCase(String str) 按字典大小比較兩個字符串,忽略大小寫,返回他們的順序差值
def str = "a"
assert str.compareToIgnoreCase("a") == 0    //相同返回0
assert str.compareToIgnoreCase("A") == 0    //忽略大小寫
assert str.compareToIgnoreCase("c") == -2   //返回差值

//Boolean equalsIgnoreCase(String str) 判斷兩個字符串是否相等,忽略大小寫

//String getAt(int index)   字符串的下標運算符
assert "abcdefg".getAt(2) == "c"
assert "abcdefg"[2] == "c"
assert "abcdefg".getAt(1..2) == "bc"    //String getAt(Range range)
assert "abcdefg"[1..2] == "bc"

//Int indexOf(String str) 返回給定子字符串在當前字符串中首次出現的索引值
assert "abcdefg".indexOf("b") == 1
assert "abcd".indexOf("g") == -1    //如果原字符串中不存在給定子字符串就返回-1

//StringBuffer leftShift(Object value)  重載<< 使兩個字符串相加,返回一個新的字符串
assert "ab".leftShift("cd").class ==  java.lang.StringBuffer
assert "ab".leftShift("cd").toString() == "abcd"

//int length() / int size()   返回字符串的長度
assert "abcd".length() == 4
assert "abcd".size() == 4

//String concat(String str) 在字符串後添加str字符串
assert "ab".concat("12") == "ab12"

//Boolean endsWith(String suffix) 測試字符串是否以給定的後綴結尾
assert "demo1".endsWith("1") == true

//String minus(Object value) 刪除字符串中value部分
assert "abcd".minus("bc") == "ad"

//String next()  按字典順序增加給定字符串末尾字符順序
assert "abcd".next() == "abce"
assert "abc1".next() == "abc2"

//String previous() 按字典順序增加給定字符串末尾字符順序
assert "abcd".previous() == "abcc"
assert "abc1".previous() == "abc0"


//String padLeft(Number numberOfCharacters) 與center()用法類似,在元字符串左邊填充空格字符
assert "abcd".padLeft(5) == " abcd" 
//String padLeft(Number numberOfCharacters,String padding) 與center()用法類似,在元字符串左邊填充padding字符
assert "abcd".padLeft(5,"12") == "1abcd"
//String padRight(Number numberOfCharacters) 與padLeft()用法類似,在元字符串左邊填充空格字符
assert "abcd".padRight(5) == "abcd " 
//String padRight(Number numberOfCharacters,String padding) 與padLeft()用法類似,在元字符串左邊填充padding字符
assert "abcd".padRight(5,"12") == "abcd1"

//String plus(Object valus) 字符串相加
assert "abcd".plus("123") == "abcd123"

//String reverse() 創建當前字符串的逆序字符串
assert "abcd".reverse() == "dcba"

//String substring(int beginIndex) 返回一個當前字符串的指定索引開始的子字符串
assert "abcd".substring(1) == "bcd"
//String substring(int beginIndex,int endIndex) 返回一個當前字符串的指定索引開始的子字符串
assert "abcd".substring(1,2) == "bc"
//Character toCharacter()
//Double toDouble()
//Float toFloat()
//Integer toInteger()
//Long toLong() 字符串類型轉換
//List toList() 將指定的字符串轉換成一個由單個字符組成的字符串列表
assert "abcd".toList() == ["a","b","c","d"]

//String toUpperCase() 將當前字符串對象的所有字符轉換爲大寫
assert "abcd".toUpperCase() == "ABCD"
//String toLowerCase() 將當前字符串對象的所有字符轉換爲小寫 
assert "ABCD".toUpperCase() == "abcd"
//List tokenize()  使用空格作爲字符串的分隔符
//List tokenize(String token) 使用指定的token參數作爲字符串的分隔符
//String[] split(String regex) 使用與給定的正則表達式相匹配的子字符串將字符串分隔爲多個字符串
// Boolean matches(String regex) 測試字符串是否匹配給定子字符串

tokenize() vs split()

1.split()返回string[], tokenize()返回list
2.tokenize()忽略空字符串

String testString = 'hello brother'
assert testString.split() instanceof String[]
assert ['hello','brother']==testString.split() //split with no arguments
assert['he','','o brother']==testString.split('l')

assert testString.tokenize() instanceof List
assert ['hello','brother']==testString.tokenize() //tokenize with no arguments
assert ['he','o brother']==testString.tokenize('l')

3.tokenize()使用字符串內的所有字符

String  testString1='hello world'
assert ['hel',' world']==testString1.split('lo')
assert ['he',' w','r','d']==testString1.tokenize('lo')

4.split()可以使用正則表達式

String testString2='hello world 123 herload'
assert['hello world ',' herload']==testString2.split(/\d{3}/)

matches()

對正則表達式感興趣的讀者可以看一下這篇文章正則表達式30分鐘入門教程

正則表達式的簡單規則

\b :單詞的開始或者結尾
\w :匹配字母或者數字或者下劃線或漢字
\d :匹配數字
{n}:表示匹配前一個規則,重複n次
. :匹配除了換行符以外的任意字符
* :*前邊的內容可以連續重複使用任意次以使整個表達式得到匹配
+ :與*相似,匹配一次或更多次數。
\s :匹配任意的空白符
^ :匹配字符串的開始
: 的意義就變成了匹配行的開始處和結束處。

assert 'hi'.matches('hi')
assert '111'.matches('\\d{3}')       //'\d':表示匹配一位數字
assert '11as11'.matches('\\d{2}.*\\d{2}')
發佈了39 篇原創文章 · 獲贊 66 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章