1. 概述
Groovy 作为一门现代 JVM 语言,提供了非常简洁、直观的语法支持正则表达式操作。本文将重点讲解 Groovy 在字符串中进行模式匹配的相关特性。
这些特性不仅简化了 Java 原生 API 的使用方式,还提升了代码可读性和开发效率。适合在日志处理、数据校验、文本解析等场景中使用。
2. 模式操作符 ~
Groovy 引入了一个简洁的模式操作符 ~
,它本质上是 Java 中 Pattern.compile()
的语法糖。
✅ 使用这个操作符,我们可以快速创建一个 Pattern
实例。
来看一个 Spock 测试示例:
def "pattern operator example"() {
given: "一个正则模式"
def p = ~'foo'
expect:
p instanceof Pattern
and: "可以使用斜线字符串避免反斜杠转义"
def digitPattern = ~/\d*/
digitPattern.matcher('4711').matches()
}
💡 小贴士:使用 /.../
斜线字符串书写正则,可以避免大量 \\
转义,推荐使用。
虽然方便,但这只是 Groovy 正则操作符的基础,后面还有更实用的操作符。
3. 匹配操作符 ==~
在实际开发中,我们往往不需要手动创建 Pattern
,而是直接判断一个字符串是否完全匹配某个正则表达式。
Groovy 提供了 ==~
操作符来完成这个任务,它返回一个布尔值,表示是否完全匹配。
✅ 它等价于调用 Java 的 Pattern.matches(regex, string)
。
示例:
def "match operator example"() {
expect:
'foobar' ==~ /.*oba.*/
and: "匹配是严格匹配整个字符串"
!('foobar' ==~ /foo/)
}
⚠️ 注意:==~
是完全匹配,不是部分匹配。
4. 查找操作符 =~
最后一个常用的 Groovy 正则操作符是 =~
,它用于查找字符串中是否包含符合正则表达式的部分,并返回一个 Matcher
实例。
✅ 这个实例可以像 Java 的 Matcher
一样使用,同时支持数组访问方式获取匹配组。
更酷的是,当它作为布尔判断使用时,会自动调用 find()
方法。
💡 这一点和 Perl 的 =~
行为一致。
来看一个实际用法:
def "find operator example"() {
when: "使用查找操作符"
def matcher = 'foo and bar, baz and buz' =~ /(\w+) and (\w+)/
then: "可以获取到匹配组数"
matcher.size() == 2
and: "支持数组方式访问匹配结果"
matcher[0][0] == 'foo and bar'
matcher[1][2] == 'buz'
and: "可以直接作为布尔表达式使用"
'foobarbaz' =~ /bar/
}
💡 技巧:matcher[n]
返回第 n 次匹配的所有组,matcher[n][m]
表示第 n 次匹配中的第 m 个分组。
5. 总结
Groovy 提供了三个简洁有力的操作符来支持正则表达式:
操作符 | 含义 | 返回类型 | 用途 |
---|---|---|---|
~ |
模式创建 | Pattern |
创建正则表达式对象 |
==~ |
完全匹配 | boolean |
判断字符串是否完全匹配正则 |
=~ |
查找匹配 | Matcher |
创建匹配器,支持分组访问和布尔判断 |
这些操作符不仅简化了 Java 原生 API 的使用,还大大提升了代码的可读性和开发效率。
官方文档也有相关示例,而且文档中的代码是经过测试的,非常值得参考:Groovy Operators - Pattern
完整示例代码已上传至 GitHub,欢迎 clone 学习:Groovy Pattern Matching Examples