恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

StarRocks regexp_count 正则匹配计数函数:语法、行为语义与 BE 向量化实现解析

  • 首页
  • 资讯中心
  • /
  • StarRocks regexp_count 正则匹配计数函数:语法、行为语义与 BE 向量化实现解析

相关资讯

交错DID偏误与CATE:新式估计量选型实战 2026/9/18 22:02:26
VS Code七大AI插件实测:从配置到避坑全指南 2026/9/18 22:02:26
shadcn-svelte 10 分钟上手:一行命令搭出可定制的 UI 组件库 2026/9/18 22:02:26

最新资讯

Vercel Build Output API 之 Prerender Functions 实战:构建期预渲染、回退页面与按需失效
3.13.0-beta.89 (2026-06-10)
大数据开发岗Java底层能力实战指南
first-contributions 项目实战:使用 git reset 重置提交的完整指南
TiXL 实时运动图形实战复盘:从 FFmpeg 路线图到高度图 SDF 场景与自定义算子开发
AI增强学术写作:从选题到投稿的智能方法论

今日推荐

2026年AI设计工具在PPT制作中的核心应用与评测
Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

StarRocks regexp_count 正则匹配计数函数:语法、行为语义与 BE 向量化实现解析

发布时间:2026/9/18 22:02:26
StarRocks regexp_count 正则匹配计数函数:语法、行为语义与 BE 向量化实现解析 StarRocks regexp_count 正则匹配计数函数语法、行为语义与 BE 向量化实现解析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksregexp_count是 StarRocks 中用于统计正则表达式模式在字符串中出现次数的标量字符串函数常用于数据清洗前的质量评估、文本特征提取和日志模式分析等场景。本文以官方函数文档为核心完整继承其语法、参数说明与全部 SQL 示例并进一步结合 StarRocks 后端BE源码解析该函数在常量模式快速路径、非重叠匹配计数、空匹配推进与 NULL 处理上的具体实现机制帮助读者从 SQL 用法一直读到底层执行逻辑。函数概览与语法regexp_count统计给定正则表达式模式在目标字符串中出现的次数返回模式出现的总次数。INT regexp_count(VARCHAR str, VARCHAR pattern)参数说明str要搜索的目标字符串数据类型为 VARCHAR。若输入为 NULL返回 NULL。pattern要匹配的正则表达式模式数据类型为 VARCHAR。若 pattern 为 NULL返回 NULL。返回值返回表示匹配次数的整型值若未找到任何匹配或输入字符串为空串返回 0。关于返回类型的一个细节值得注意官方文档中给出的语法签名为INT而在后端内置函数注册表 functions.py 中该函数函数 ID 30335的返回类型注册为BIGINT实现入口为StringFunctions::regexp_count并带有regexp_count_prepare与regexp_close生命周期钩子。两处均以整型承载计数结果实际使用时以运行时返回的结果类型为准。基础用法示例以下示例完整继承自官方文档 regexp_count.md。统计数字出现次数-- Count occurrences of digits SELECT regexp_count(abc123def456, [0-9]);--------------------------------------- | regexp_count(abc123def456, [0-9]) | --------------------------------------- | 6 | ---------------------------------------模式[0-9]逐字符匹配abc123def456中共有 6 个数字字符因此结果为 6。统计标点出现次数-- Count occurrences of dots SELECT regexp_count(test.com test.net test.org, \\.);--------------------------------------------------- | regexp_count(test.com test.net test.org, \\.) | --------------------------------------------------- | 3 | ---------------------------------------------------注意 SQL 字符串字面量中的转义\.在 SQL 中写作\\.表示匹配字面意义的句点而不是任意字符。统计空白序列数量-- Count occurrences of whitespace sequences SELECT regexp_count(a b c d, \\s);---------------------------------------- | regexp_count(a b c d, \\s) | ---------------------------------------- | 3 | ----------------------------------------这里的关键在于贪婪量词连续多个空白被视为一个匹配单元因此 1 个空格、2 个空格、3 个空格各计 1 次共 3 次。这与regexp_count(a b c d, \\s)的计数结果不同后者会把每个空白字符单独计数。非重叠重复模式-- Count occurrences of a repeated pattern SELECT regexp_count(ababababab, ab);------------------------------------ | regexp_count(ababababab, ab) | ------------------------------------ | 5 | ------------------------------------这个例子体现了regexp_count的核心匹配语义非重叠non-overlapping计数。字符串ababababab中ab虽然出现在 5 个起点位置0、2、4、6、8但由于匹配是从左到右、每次从上一匹配的结尾继续ab每消耗 2 个字符共匹配 5 次。计数不会像滑动窗口那样把重叠出现位置也计入。NULL 与空串边界-- Using with NULL and empty values SELECT regexp_count(, .) AS empty_str, regexp_count(NULL, .) AS null_str, regexp_count(abc, NULL) AS null_pattern;------------------------------------ | empty_str | null_str | null_pattern | ------------------------------------ | 0 | NULL | NULL | ------------------------------------边界行为归纳空字符串作为str返回 0没有任何位置可匹配str为 NULL返回 NULLpattern为 NULL返回 NULL。Unicode / 中文字符统计-- Count occurrence of Unicode/Chinese characters SELECT regexp_count(abc中文def, [\\p{Han}]);----------------------------------------------- | regexp_count(abc中文def, [\\p{Han}]) | ----------------------------------------------- | 1 | -----------------------------------------------StarRocks 的正则引擎支持 Unicode 类别。[\p{Han}]匹配连续汉字串abc中文def中中文是连续的两个汉字被贪婪地匹配为一个单元因此计数为 1。若想统计汉字字符总数应去掉量词写成regexp_count(abc中文def, [\\p{Han}])结果为 2。结合表数据使用CREATE TABLE sample_text ( str VARCHAR(65533) NULL, regex VARCHAR(65533) NULL ); INSERT INTO sample_text VALUES (abc123def456, [0-9]), (test.com test.net test.org, \\.), (a b c d, \\s), (ababababab, ab); SELECT str, regex, regexp_count(str, regex) AS count FROM sample_text ORDER BY str;------------------------------------------ | str | regex| count | ------------------------------------------ | a b c d | \s | 3 | | abc123def456 | [0-9]| 6 | | ababababab | ab | 5 | | test.com test.net test.org | \. | 3 | ------------------------------------------当pattern来自表列即模式逐行变化时BE 会走逐行编译的通用路径这一点在下一节的源码分析中有详细说明。BE 实现剖析常量快速路径与通用路径regexp_count的实现位于 string_functions.cpp声明位于 string_functions.h采用 RE2 正则引擎。整体分为 prepare 准备阶段与向量化执行两个环节。prepare 阶段常量模式预编译在 StringFunctions::regexp_count_prepare 中FRAGMENT_LOCAL 作用域执行校验必须恰好 2 个参数否则返回InvalidArgument(regexp_count requires 2 arguments)若第 2 个参数pattern是常量列且非 NULL则在函数状态下保存该模式并提前编译为re2::RE2对象若模式非法直接报错Invalid regex expression: pattern查询快速失败若 pattern 非常量则 prepare 阶段不做预编译留给执行阶段逐行处理。这一设计意味着SELECT regexp_count(col, 固定模式)这类最常见用法中正则只编译一次随后通过get_thread_local_regex获取线程本地副本复用避免每行重复编译的开销。常量模式快速路径当 prepare 阶段成功预编译后执行走 regexp_count_const_pattern// return NULL if patern empty if (const_re-pattern().empty()) { return ColumnHelper::create_const_null_column(size); } ... int count 0; re2::StringPiece match; size_t start_pos 0; // count while (start_pos input.size() const_re-Match(input, start_pos, input.size(), re2::RE2::UNANCHORED, match, 1)) { count; if (match.size() 0) { start_pos; } else { start_pos match.data() - input.data() match.size(); } }循环逻辑清晰揭示了计数语义的底层实现从start_pos起以UNANCHORED非锚定方式执行Match命中即计数加 1若本次匹配非空start_pos跳到匹配串的结尾——这正是非重叠语义的来源也是ababababab匹配ab得到 5 而非更多/更少的直接原因若本次匹配为空例如模式.*或a*这类可匹配空串的正则start_pos只前移 1 个字节——这是防止空匹配导致死循环的关键防护同时也定义了空匹配的计数规则空匹配按位置逐个计数最多不超过字符串长度1 次。通用路径逐行模式当 pattern 为非常量列时执行走 regexp_count_general。其行级处理规则与文档行为一致且补充了几个文档未展开的边界str或pattern任意为 NULL 的行 → 该行返回 NULLpattern为空串的行 → 该行返回 NULL而非 0。这与常量路径中空模式返回整列 NULL保持一致pattern非法RE2 编译失败的行 → 该行返回 NULL查询不会整体失败。从源码结构看这是为了容忍表中混入脏数据如某行的模式列恰好存了非法正则的场景而常量模式下非法模式会在 prepare 阶段直接报错因为整个查询共用这一个模式尽早失败更有价值若所有行的 pattern 均为空串则直接返回整列 NULL 常量列。计数循环本身与常量路径完全相同非重叠推进 空匹配步进 1保证两种路径语义一致。类型与结果构建两条路径均以ColumnBuilderTYPE_BIGINT构建结果列与注册表 functions.py 中声明的BIGINT返回类型对应印证了前文对文档签名INT的说明。测试验证该函数的后端测试位于 string_fn_test.cpp其中包含针对regexp_count的用例可在仓库中直接查看具体断言。若要本地验证示例行为最直接的方式是在 StarRocks 客户端中依次执行上文基础用法示例中的 SQL对照每个例子的输出表。相关函数regexp_count属于 StarRocks SQL 函数体系中LIKE 与谓词类函数like-predicate-functions一族同目录下还有语义互补的兄弟函数可配合使用like.md通配符匹配%/_适合简单模式判断regexp.md正则布尔判断是否匹配regexp_extract.md 与 regexp_extract_all.md提取匹配内容regexp_replace.md按模式替换替换时的匹配次数逻辑与regexp_count的计数逻辑同源于 RE2 的非重叠匹配。选择建议只判断是否包含用regexp/like需要出现了几次用regexp_count需要提取出来用regexp_extract系列。三者组合可以覆盖大多数文本特征统计需求例如先regexp_count(col, [0-9])评估某列数字片段的密度再regexp_replace完成清洗。小结regexp_count(str, pattern)统计模式在字符串中非重叠出现的次数无匹配返回 0NULL 输入返回 NULL转义是高频坑SQL 字面量中匹配字面量需双重转义\.写作\\.贪婪量词决定计数粒度\\s按空白段计数\\s按空白字符计数从源码看常量模式会被预编译为 RE2 对象并走快速路径逐行模式则每行编译、非法/空模式安全降级为 NULL保证批量查询中脏模式不会拖垮整条查询注册信息ID 30335、BIGINT 返回见 functions.py实现见 string_functions.cpp测试见 string_fn_test.cpp。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号