Groovy字符串与正则

字符串

  • 单引号,类似于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}")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 什么是 Groovy? 简言之,Groovy是一种基于JVM(Java虚拟机)的敏捷动态开发语言。它是一种成熟的面...
    北纬26阅读 4,066评论 0 14
  • Groovy :是一种动态语言。 1:这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单...
    PeytonWu阅读 1,482评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 小小一副麻将,里面可是包含了非常多的关于中国的思想和道理在其中 在中国古代思想中,3为基数,9为极数,所以万、饼、...
    飞城阅读 240评论 1 2