Groovy使用~”pattern” 来支持正则表达式,它将使用给定的模式字符串创建一个编译好的Java Pattern 对象。Groovy也支持 =~(创建一个Matcher)和 ==~ (返回boolean,是否给定的字符串匹配这个pattern)操作符。

对于groups的匹配, matcher[index] 是一个匹配到的group字符串的List或者string。

1 import java.util.regex.Matcher
2 import java.util.regex.Pattern
3 // ~ creates a Pattern from String
4 def pattern = ~/foo/
5 assert pattern instanceof Pattern
6 assert pattern.matcher("foo").matches() // returns TRUE
7 assert pattern.matcher("foobar").matches() // returns FALSE, because matches() must match whole String
8  
9 // =~ creates a Matcher, and in a boolean context, it's "true" if it has at least one match, "false" otherwise.
10 assert "cheesecheese" =~ "cheese"
11 assert "cheesecheese" =~ /cheese/
12 assert "cheese" == /cheese/ /*they are both string syntaxes*/
13 assert ! ("cheese" =~ /ham/)
14  
15 // ==~ tests, if String matches the pattern
16 assert "2009" ==~ /\d+/ // returns TRUE
17 assert "holla" ==~ /\d+/ // returns FALSE
18  
19 // lets create a Matcher
20 def matcher = "cheesecheese" =~ /cheese/
21 assert matcher instanceof Matcher
22  
23 // lets do some replacement
24 def cheese = ("cheesecheese" =~ /cheese/).replaceFirst("nice")
25 assert cheese == "nicecheese"
26 assert "color" == "colour".replaceFirst(/ou/, "o")
27  
28 cheese = ("cheesecheese" =~ /cheese/).replaceAll("nice")
29 assert cheese == "nicenice"
30  
31 // simple group demo
32 // You can also match a pattern that includes groups. First create a matcher object,
33 // either using the Java API, or more simply with the =~ operator. Then, you can index
34 // the matcher object to find the matches. matcher[0] returns a List representing the
35 // first match of the regular expression in the string. The first element is the string
36 // that matches the entire regular expression, and the remaining elements are the strings
37 // that match each group.
38 // Here's how it works:
39 def m = "foobarfoo" =~ /o(b.*r)f/
40 assert m[0] == ["obarf""bar"]
41 assert m[0][1] == "bar"
42  
43 // Although a Matcher isn't a list, it can be indexed like a list. In Groovy 1.6
44 // this includes using a collection as an index:
45  
46 matcher = "eat green cheese" =~ "e+"
47  
48 assert "ee" == matcher[2]
49 assert ["ee""e"] == matcher[2..3]
50 assert ["e""ee"] == matcher[02]
51 assert ["e""ee""ee"] == matcher[01..2]
52  
53 matcher = "cheese please" =~ /([^e]+)e+/
54 assert ["se""s"] == matcher[1]
55 assert [["se""s"], [" ple"" pl"]] == matcher[12]
56 assert [["se""s"], [" ple"" pl"]] == matcher[1 .. 2]
57 assert [["chee""ch"], [" ple"" pl"], ["ase""as"]] == matcher[0,2..3]
58 // Matcher defines an iterator() method, so it can be used, for example,
59 // with collect() and each():
60 matcher = "cheese please" =~ /([^e]+)e+/
61 matcher.each println it }
62 matcher.reset()
63 assert matcher.collect { it }?? ==
64  [["chee""ch"], ["se""s"], [" ple"" pl"], ["ase""as"]]
65 // The semantics of the iterator were changed by Groovy 1.6.
66 // In 1.5, each iteration would always return a string of the entire match, ignoring groups.
67 // In 1.6, if the regex has any groups, it returns a list of Strings as shown above.
68  
69 // there is also regular expression aware iterator grep()
70 assert ["foo""moo"] == ["foo""bar""moo"].grep(~/.*oo$/)
71 // which can be written also with findAll() method
72 assert ["foo""moo"] == ["foo""bar""moo"].findAll { it ==~ /.*oo/ }

More Examples

匹配每行开头的大写单词:

1 def before='''
2 apple
3 orange
4 y
5 banana
6 '''
7  
8 def expected='''
9 Apple
10 Orange
11 Y
12 Banana
13 '''
14  
15 assert expected == before.replaceAll(/(?m)^\w+/,
16  { it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1] : '') })

匹配字符串中的每一个大写单词

1 assert "It Is A Beautiful Day!" ==
2  ("it is a beautiful day!".replaceAll(/\w+/,
3  { it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1] : '') }))

使用 .toLowerCase() 让其他单词小写:

1 assert "It Is A Very Beautiful Day!" ==
2  ("it is a VERY beautiful day!".replaceAll(/\w+/,
3  { it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1].toLowerCase() :'') }))

Gotchas

怎么使用String.replaceAll()的反向引用

GStrings 可能和你期望的不一样

1 def replaced = "abc".replaceAll(/(a)(b)(c)/, "$1$3")

产生一个类似于下面的错误:

[] illegal string body character after dollar sign:

解决办法:: either escape a literal dollar sign “\$5″ or bracket the value expression “${5}” @ line []

Solution:

Use ‘ or / to delimit the replacement string:

1 def replaced = "abc".replaceAll(/(a)(b)(c)/, '$1$3')

groovy-正则表达式的更多相关文章

  1. groovy regex groups(groovy正则表达式组)

    先看一个java正则表达式的例子. import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestM ...

  2. Groovy正则表达式复杂逻辑判断实例

    下面的两个pattern(p1和p2)分别代表了(A or B) and (C or D)和(A and B) or (C and D)的跨行匹配结果,当然还可以用正则表达式构建更复杂的pattern ...

  3. groovy中的正则表达式操作符【groovy】

    groovy中对于正则表达式的书写进行了简化,同时引入了新的操作符,使得正则表达式使用起来比较方便简单. 对于书写的改进: 比如 assert "\\d" == /\d/ 也就是在 ...

  4. Groovy入门经典 随书重点

    1 数值和表达式 1.1数值 整数是Integer类的实例 有小数部分的数值是BigDecimal类的实例 不同于java,没有基础数据类型 一切皆对象的概念重于java 1.2表达式 两个整数的除法 ...

  5. 30分钟groovy快速入门并掌握(ubuntu 14.04+IntelliJ 13)

    本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员.了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合.内置正则表达式和闭包. ...

  6. Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)

        上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...

  7. atitit groovy 总结java 提升效率

    atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3.  添加 Groovy 类 2 4.  编译运行groovy类 ...

  8. Groovy split竖杆注意

    前几天将09年写的一个Asp程序使用Grails改造重写,在处理手机号码Split的时候,Asp代码: dim phoneArr phoneArr = split(phones,"|&quo ...

  9. 新学习的语言Groovy

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...

  10. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...

随机推荐

  1. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  2. jq 获取table元素,ajax 静态填加数据

    知识点: 1.jq如何操作table->操作html内的元素 2. this 怎么使用 问题: 1.点击 修改 后,自动刷新了.判断取值,提示错误.正确出不来 2.ajax传值操作如何保密 ht ...

  3. Linux下smokeping网络监控环境部署记录

    smokeping是一款监控网络状态和稳定性的开源软件(它是rrdtool的作者开发的),通过它可以监控到公司IDC的网络状况,如延时,丢包率,是否BGP多线等:smokeping会向目标设备和系统发 ...

  4. 入门Linux

    45分钟带你入门Linux(附:笔者在工作室开讨论班录制的视频讲解)   第一部分    熟悉Linux基本操作 一.初识Linux 1.Linux特点 ◊  开放性 ◊  多用户 ◊  多任务 ◊  ...

  5. GIS开源软件大全

    3 - F 3map:行星地球项目由3map驱动,这是一个自由软件,由Telstra宽带基金会创建并支持,提供客户端与服务器的能力以在线再现虚拟地球. Amein!:其界面介于ArcMap和UMN M ...

  6. Easyui Combotree问题及其相关

    Easyui的setValue方法无效 今天在开发项目的时候,遇到第一个很奇怪的问题:EasyUI的setValue方法无效. $('#department_parent').combotree('s ...

  7. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  8. [CareerCup] 3.6 Sort Stack 栈排序

    3.6 Write a program to sort a stack in ascending order (with biggest items on top). You may use at m ...

  9. 20145208《Java程序设计》第3周学习总结

    20145208 <Java程序设计>第3周学习总结 教材学习内容总结 认识对象 类类型 在第三章的学习中,我了解到JAVA可区分为基本类型和类类型两种类型,在上周的学习中我学习了JAVA ...

  10. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...