groovy-正则表达式

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')
时间: 2024-09-21 03:40:47

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

在Groovy中编写正则表达式

与Java相比, 在Groovy中编写正则表达式(regexes)简直是一种乐趣.在 Java中, regexes编程不仅需处理Pattern和Matcher对象,而且还要编写繁琐的 样板代码(boilerplate coding).而Groovy对这两个Java对象做了简单封装, 添加了一些额外的实用方法,并给出一个简化的新的语法和3个新的操作符. Groovy中,您可用slashy(斜线)语法"/../"定义字符串.这样以来便可避 免在Java正则表达式中使用过多的反斜线.例如:

iOS开发验证判断语句之正则表达式小结_IOS

前言 大家都知道开发一直离不开一些常用验证格式,比如:邮箱,手机号等等,在开发过程中一般都会新建一个工具类,专门管理这些验证方式,简便开发过程.一般都采用正则表达式的形式来做判断,本文列举一些项目中非常实用的一些正则表达式的判断语句,以后开发起来直接复制粘贴就可以,这样大大节省了开发时间,下面不多说,直接上代码. 一.验证移动手机号: + (BOOL)isMobile:(NSString*)mobile { NSString *regex = @"^1+[34578]+\d{9}";

数据库中使用正则表达式小结_正则表达式

本篇文章通过两个示例给大家介绍数据库中使用正则表达式小结,在此不多说,具体内容请看下文详解吧. 示例一: CREATE FUNCTION dbo.RegExpTest ( @source varchar(), --需要匹配的源字符串 @regexp varchar(), --正则表达式 @ignorecase bit = --是否区分大小写,默认为false ) RETURNS bit --返回结果-false,-true AS BEGIN --(成功)或非零数字(失败),是由OLE 自动化对象

Groovy语法介绍

1. 介绍 Groovy 是基于 JRE 的脚本语言,和Perl,Python等等脚本语言一样,它能以快速简洁的方式来完成一些工作:如访问数据库,编写单元测试用例,快速实现产品原型等等. Groovy 是由James Strachan 和 Bob McWhirter 这两位天才发明的(JSR 241 2004 年 3 月).Groovy 完全以Java API为基础,使用了Java开发人员最熟悉的功能和库.Groovy 的语法近似Java,并吸收了 Ruby 的一些特点,因此 Groovy 在某

《Groovy语言规范》-语法

原文链接  译者:王山山 语法 本章节涵盖了Groovy编程语言的语法.Groovy语言的语法源自Java语法,为Groovy增强了特定构造,允许一定程度上的简化语法. 1.注释 1.1.单行注释 单行注释以//开始,在一行中任何位置都可以被发现.//后面的字符,直到一行的末尾都是注释的一部分. // a standalone single line comment println "hello" // a comment till the end of the line 1.2.多行

Groovy探索之Gstring

Groovy语言里有很多看起来不起眼的小玩意,但使用以后,我们却常常会惊异于它的巨大能量,Gstring就是其中之一. Java的String对象是我们最最常用的对象,却也是诟病最多的对象.一句话来说,String使用起来非常不方便.而Gstring不但使用方便,而且更是Groovy语言动态性的基础. 所谓Gstring,是指通过双引号引起来的.带有占位表达式的字符串,如:def str = "${name}'s dog is ${dog.name}",其中由美元符号括起来的部分就是占

用Groovy进行Ant脚本编程

Ant 作为 Java 项目构建工具的普遍性和实用性是无法超越的.即使是 Maven 这个构建领域的新锐工具,也要把自己的许多强大能力归功于从 Ant 学到的经验.但是,这两个工具有共同的不足之处:扩展性.即使 XML 的可移植性在促进 Ant 和 Maven 走向开发前端上扮演了主要角色,XML 作为构建配置格式的角色仍然或多或少地限制了构建过程的表现力. 例如,虽然在 Ant 和 Maven 中都有条件逻辑,但是用 XML 表示有些繁琐.而且,虽然可以定义定制任务来扩展 Ant 的构建过程,

Groovy Tip 37 字符串和数字之间的转化

字符串和数字之间的转化是我们在项目中必然要碰到的问题,因为我们从用户界面取得的变量的值肯 定是字符串. 所以,我们在项目中经常要做的事情就是:第一,需要对用户的输入进行校验,以判断用户的输入是 否是一个数字:第二,如果是的话,我们则需要进一步把它转化为数字,以方便我们进行计算. 在Java语言中,我们要判断一个字符串是否是数字,基本上有两种方法,第一是直接进行转化,如果 有Exception抛出,则该字符串非我们所需要的数字.如下面就是一段判定一个字符串是否为整型数字的 代码: public s

精通 Groovy

关于 Groovy 这篇文章讲述它是什么,它与 Java 语言和 JVM 的关系,以及编写 Groovy 代码的一些要点. 什么是 Groovy? Groovy 是 JVM 的一个替代语言 -替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码.目前的 Groovy 版本是 1.5.4,在 Java 1.4 和 Java 5 平台上都能使

Groovy与Java集成常见的坑

groovy特性 Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码. Java作为一种通用.静态类型的编译型语言有很多优势,但同样存在一些负担: 重新编译太费工: 静态类型不够灵活,重构起来时间可能比较长: 部署的动静太大: java的语法天然不适用生产dsl: 相对于Java,它在编写代码的灵活性上有非常明显的