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


原始标题:Pattern Matching in Strings in Groovy | Baeldung