You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring JPA中使用PostgreSQL的regexp_matches函数编写查询

使用Spring JPA调用PostgreSQL的regexp_matches函数指南

先帮你修正当前代码里的几个关键问题,再给出几种实用的写法:

你当前代码的问题

  • 函数名写错了:PostgreSQL的正则匹配提取函数是**regexp_matches**,不是你写的matches_regexp
  • 返回类型适配问题:regexp_matches默认返回text[](文本数组),直接用List<Object>会不好处理,建议用更精准的类型

写法1:直接获取匹配的分组数组

如果需要获取正则匹配到的所有分组结果,可以用List<String[]>来接收返回值,每个数组元素对应一组匹配结果:

@Query(nativeQuery = true, value = "SELECT regexp_matches(t1.name, '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$') AS t1_name FROM testDb.testTable t1")
List<String[]> getRegexMatches();

举个例子,如果t1.name是"foo/bar/",返回的数组会是["foo/", "bar"],对应正则里的两个分组。

写法2:将匹配结果转为字符串

如果不需要分组数组,只想拿到合并后的匹配字符串,可以用PostgreSQL的array_to_string函数转换结果:

@Query(nativeQuery = true, value = "SELECT array_to_string(regexp_matches(t1.name, '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$'), '') AS t1_name FROM testDb.testTable t1")
List<String> getRegexMatchesAsString();

这样上面的例子会直接返回"foo/bar"。

写法3:仅判断是否匹配(更高效)

如果你的需求只是判断字段是否符合正则,不需要提取分组,建议用PostgreSQL的~正则匹配操作符,返回布尔值更直观:

@Query(nativeQuery = true, value = "SELECT (t1.name ~ '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$') AS is_match FROM testDb.testTable t1")
List<Boolean> isNameMatchingRegex();

额外注意事项

  • 如果你的实体类已经用@Table(name = "testTable", schema = "testDb")指定了schema,查询里可以省略testDb.前缀
  • 若要全局匹配所有符合规则的子串,可在正则末尾加g标志:regexp_matches(t1.name, 'your_regex', 'g')
  • 可以通过索引获取特定分组,比如(regexp_matches(t1.name, 'your_regex'))[2]直接拿到第二个分组的结果

内容的提问来源于stack exchange,提问作者Mohamed Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:02:29