与Java相比, 在Groovy中编写正则表达式(regexes)简直是一种乐趣。在Java中, regexes编程不仅需处理Pattern和Matcher对象,而且还要编写繁琐的样板代码(boilerplate coding)。而Groovy对这两个Java对象做了简单封装,添加了一些额外的实用方法,并给出一个简化的新的语法和3个新的操作符。
Groovy中,您可用slashy(斜线)语法“/../”定义字符串。这样以来便可避免在Java正则表达式中使用过多的反斜线。例如:
- assert (/Hello World/ in String)
- assert (/Hi \there/ == 'Hi \\there')
Groovy新增的第1个正则表达式操作符便是模式操作符(~),它使得字符串被编译成一个Pattern实例。例如:
也可使用Java实现,如:
import java.util.regex.*
表3.1中列出了常用的正则表达式模式及含义。完整的正则表达式清单可参考Pattern api文档,http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html。
表3.1 常用的正则表达式模式
模式 含义
a?
尽可能匹配1次a,也可以不匹配
a*
表达式尽可能的多匹配a,最少可以不匹配
a+
尽可能的多匹配a,至少匹配1次
a|b
匹配a或b
(ab)
分组
.
匹配任意一个字符
[abc]
匹配a,b或c
[^abc]
匹配除了a,b或c的任意一个字符
[a-z]
匹配a到z之间的任意一个字母
\d
任意一个数字,0-9 中的任意一个
\s
空格、制表符、换页符等空白字符的其中任意一个
\w
任意一个字母或数字或下划线,也就是 A-Z,a-z,0-9,_ 中任意一个
\b
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
^
与字符串开始的地方匹配,不匹配任何字符
$
与字符串结束的地方匹配,不匹配任何字符
第2个操作符是查找操作符(=~),它负责从左边的字符串和右边的模式来创建一个Matcher对象。
import java.util.regex.Matcher
同理,其Java实现,如:
import java.util.regex.*;
您可把Matcher对象看作一个二维矩阵。第1维表示每一个与模式相匹配的字符串;第2维表示每个匹配内的捕获组(capture group),详见清单3.2中的例子。
清单3.2 Using Regexes Groups with Matcher
最后一个是匹配操作符(==~),该操作符返回一个Boolean值,说明操作符左侧的整个字符串是否右侧的模式相匹配,例如:
assert "Groovy" ==~ /G.*/
正则表达式也可与String的replace*形式的方法(如replaceFirst等)结合使用。例如:
GDK String还提供了一个可接受闭包的replace方法,该闭包可用来操作每个捕捉组(captured group),例如
//把所有的“Groovy”转换为大写形式
您可以使用grep方法,该方法利用正则表达式筛选一个集合,并返回集合中满足给定过滤条件的元素。例如:
//返回集合中以“G”开头的元素
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。