字符串
- 單引號,類似于Java中的String,不會對$進行處理,即就是字符串;
def h = 'Hello $ better' // 輸出的 Hello $ better - 雙引號,如果字符串中有$符號,會對$表達式進行先求值,沒有則跟單引號類似;
def i = 128;
def str = 'Hello $i' // 輸出的是 Hello 128 - 三引號,‘’‘XXX’‘’,就字符串進行換行輸出;
字符串操作
可通過索引來獲取字符串中的子串;
// 索引
def better = 'better'
better[2] // t
better[-1] // r index from end
println(better[0..2]) // bet
println(better[4..2]) // ett
// 方法,Groovy新增一些String的一些方法,如:center、reverse等等
def message = "better"
println(message.center(15)) // better 居中
println(message.center(15, "*")) // ****better*****
println(message.padLeft(15, "*")) // *********better
println(message.tokenize('e')) // [b, tt, r]
1..2
被稱為范圍(range)
groovy 中正則的定義:
在Groovy中 groovy 正則使用 ~'regex' 定義正則,也可以使用 // 來定義,如:
// ==== groovy 正則創建 ====
def regex = ~'better' // 創建正則,將字符串編譯成 Pattern
def match = 'zhaoyubetter' =~ 'better' // 將操作符左邊的字符串跟右邊的Pattern進行局部匹配,返回為Mather
def match1 = 'zhaoyubetter' =~ regex
println(match.find()) // true
println(match1.find()) // true
// === 精確匹配 ==~(左邊整個字符串與右邊的模式) ==
// 類似 matcher.matches()
println( 'zhaoyubetter' ==~ 'better') // false
// ===== 支持 // 來定義正則 (意思是不要寫2個\\)=====
regex = ~/\w+@\w+(\.\w+)+/
println(('zhaoyubetter@126.com' =~ regex).find()) // true
分組匹配
// ==== 分組匹配 ====
// Groovy 簡化了matcher操作,可把Matcher對象看作一個二維矩陣。
// 第1維表示每一個與模式相匹配的字符串;
// 第2維表示每個匹配內的捕獲組(capture group)
// android 中 為 xml 指定id的方式如下:
def str1 = "@+id/button1"
def str3 = "@id/button3"
def str2 = "@android:id/button2"
println("----- 分組獲取 -----")
pattern = ~/@((\+id)|(id)|(android:id))\/(.*)/
matcher = str1 =~ pattern
println("分類1:${matcher[0][2]} ${matcher[0][3]} ${matcher[0][4]} ${matcher[0][5]}")
matcher = str2 =~ pattern
println("分類2:${matcher[0][2]} ${matcher[0][3]} ${matcher[0][4]} ${matcher[0][5]}")
matcher = str3 =~ pattern
println("分類3:${matcher[0][2]} ${matcher[0][3]} ${matcher[0][4]} ${matcher[0][5]}")
輸出:
----- 分組獲取 -----
分類1:+id null null button1
分類2:null null android:id button2
分類3:null id null button3
統計代碼正則分析:
java 程序中,注釋分為2種,一種 // ,一種 /**/(存在多行的情況),我們先來定義正則如下:
def regex1 = ~/^\s*\/\/.*/ // 表示注釋1
def regex2 = ~/^\s*\/\*.*\*\/\s*$/ // 表示注釋2
def regex2_start = ~/^\s*\/\*.*/ // 表示注釋2頭
def regex2_end = ~/.*\*\/\s*$/ // 表示注釋2尾
def regex_space = ~/^\s*\s*$/ // 空行
// 可以使用下面的代碼進行測試
def explainStr1 = 'def a = \'ddd\' //cc'
def explainStr2 = '/***wojfjsjf'
def explainStr3 = '*/ '
def explainStr4 = '/*adfdfsfdsdf*/'
def spaceLineStr = ' '
測試沒問題后,進行程序類的編寫如下:
class CodeLineCountRegex2 {
// ===== 注釋類型 ===
// 我是注釋1 單號
// ---> /* 我是注釋2 頭
// ---> */ 我是注釋2 尾
def regex1 = ~/^\s*\/\/.*/ // 表示注釋1
def regex2 = ~/^\s*\/\*.*\*\/\s*$/ // 表示注釋2
def regex2_start = ~/^\s*\/\*.*/ // 表示注釋2頭
def regex2_end = ~/.*\*\/\s*$/ // 表示注釋2尾
def regex_space = ~/^\s*\s*$/ // 空行
def explainLine = 0
def codeLine = 0
def spaceLine = 0
def regex_begin = false // 是否注釋2開始了
// 文件的遞歸遍歷
def codeLineCount(File file) {
if (file.exists()) {
if (file.isDirectory()) {
file.eachFile { current ->
codeLineCount(current)
}
} else {
anylise(file)
}
}
}
// 分別分析每一個文件
def anylise(file) {
file.each { line ->
if (regex_begin) { // 是否注釋2開始了
explainLine++
if ((line =~ regex2_end).matches()) {
explainLine++
regex_begin = false
}
} else {
if ((line =~ regex1).matches()) {
explainLine++
} else if ((line =~ regex2).matches()) {
explainLine++
} else if ((line =~ regex2_start).matches()) {
regex_begin = true
} else if ((line =~ regex_space).matches()) {
spaceLine++
} else {
codeLine++
}
}
}
}
}
測試程序如下:
def file = new File("/Users/zhaoyu/Documents/Java/Pattern/src/com/better/groovy/base/CharTimes.groovy")
if(file.exists()) {
println("文件存在")
CodeLineCountRegex2 regex2 = new CodeLineCountRegex2()
regex2.codeLineCount(file)
println("行數:${regex2.codeLine}")
println("注釋:${regex2.explainLine}")
println("空行:${regex2.spaceLine}")
}