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),仅供参考

相关新闻

交错DID偏误与CATE:新式估计量选型实战

交错DID偏误与CATE:新式估计量选型实战

双重差分(DID)这套方法,我最早是当成"两个差分一减就完事"的工具来用的——找个对照组、找个处理组、各看前后变化,差值再相减,系数就是政策效应。真到了自己上手做项目,尤其是碰到那种政策分批铺…

2026/9/18 22:02:29 阅读更多 →
VS Code七大AI插件实测:从配置到避坑全指南

VS Code七大AI插件实测:从配置到避坑全指南

VS Code这几年基本成了开发者的默认选择,尤其是配合大模型AI插件之后,整个编码的体验完全变了个样。我第一次在编辑器里看到AI补全代码时,说实话是有点怀疑的,觉得这八成就是个增强版的自动补全。但很快我就发现,这东西…

2026/9/18 22:02:29 阅读更多 →
shadcn-svelte 10 分钟上手:一行命令搭出可定制的 UI 组件库

shadcn-svelte 10 分钟上手:一行命令搭出可定制的 UI 组件库

shadcn-svelte 10 分钟上手:一行命令搭出可定制的 UI 组件库 【免费下载链接】shadcn-svelte shadcn/ui, but for Svelte. ✨ 项目地址: https://gitcode.com/GitHub_Trending/sh/shadcn-svelte 做过 Svelte 项目的人多半撞过同一堵墙:React 那边…

2026/9/18 22:02:29 阅读更多 →

最新新闻

TypeSpec HTTP Client JS 中的 File 序列化:multipart 文件上传与 base64 编码控制

TypeSpec HTTP Client JS 中的 File 序列化:multipart 文件上传与 base64 编码控制

TypeSpec HTTP Client JS 中的 File 序列化:multipart 文件上传与 base64 编码控制 【免费下载链接】typespec 项目地址: https://gitcode.com/GitHub_Trending/ty/typespec 导读 在 TypeSpec 生态中,File 是描述 HTTP 请求、响应与 multipart …

2026/9/18 22:52:52 阅读更多 →
ESP32-S3 多 SPI 设备并行在线:4 步让两条总线不打架

ESP32-S3 多 SPI 设备并行在线:4 步让两条总线不打架

ESP32-S3 多 SPI 设备并行在线:4 步让两条总线不打架 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 屏幕刚亮起来画面就花了,SD 卡里的日志文件直…

2026/9/18 22:52:52 阅读更多 →
5月工作笔记

5月工作笔记

半导小新网站可以用来查看规格书或者嘉立创 1、RS485: 1)主从模式,只能单一主机可以多个从机 2)主机收发信息都会占用AB线,所以为半双工模式 3)在差分信号中,逻辑0和逻辑1是用两根信号线(A和B-&#xff…

2026/9/18 22:52:52 阅读更多 →
Flink Checkpoint 与两阶段提交:端到端精确一次实战

Flink Checkpoint 与两阶段提交:端到端精确一次实战

最近把一个实时链路从"尽力而为"往"精确一次"上推,踩的坑几乎全集中在 Checkpoint 和外部系统的交界处。Flink 的 Checkpoint 本身解决的是作业内部状态的一致性——算子状态、KeyedState、OperatorState 都能靠一次全局快照对齐。但数据一旦要…

2026/9/18 22:52:52 阅读更多 →
AMCT 大模型压缩实战:LongCat-Flash-Lite / LongCat-Next 系列适配与量化完整指南

AMCT 大模型压缩实战:LongCat-Flash-Lite / LongCat-Next 系列适配与量化完整指南

AMCT 大模型压缩实战:LongCat-Flash-Lite / LongCat-Next 系列适配与量化完整指南 【免费下载链接】amct AMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。 项目地址: https://gitcode.com/cann/amct 本篇基于 CANN AMCT(昇腾 AI 处理器亲和的…

2026/9/18 22:52:52 阅读更多 →
CANN 模型推理优化编排中的 Plan Dashboard 模板:从候选发现到最终验收的单一真相源实践

CANN 模型推理优化编排中的 Plan Dashboard 模板:从候选发现到最终验收的单一真相源实践

CANN 模型推理优化编排中的 Plan Dashboard 模板:从候选发现到最终验收的单一真相源实践 【免费下载链接】cann-recipes-infer 本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/c…

2026/9/18 22:51:52 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →