捕获组标记无法正常识别

BUG反馈 · 33 次浏览
白云朔 创建于 4天7小时前

【测试用例】:

输入:01@02
正则表达式:(.+)@(.+)
替换值:$21

 

【测试结果】:

输出:$21

可以看到,如果在捕获组标记“$数字”(即上图的“$2”)后方直接跟上数字,会导致引用捕获组2(即上图的“$2”)失败,即直接输出了$21

 

【正确运行结果】:参考RegExr: 学习、构建 和 测试 正则表达式 Test RegEx

输出:021

白云朔 最后更新于 2025/10/21

回复内容
CL 3天22小时前
#1

这是正常现象。在 C# 的 Regex.Replace 中,替换字符串里的 $number 才会被视为捕获组引用,而当你写成 $21 时,正则引擎会优先将它解释为第 21 个捕获组,因为数字会被连续解析。

你的例子:

输入:01@02
正则:(.+)@(.+)
替换:$21

引擎会将 $21 解释为 第21组 → 发现没有 → 输出原样 $21,而不是 $2 + 1


正确解决方式

你需要告诉正则引擎 $2 到此为止,再加上 1,常见做法:

方法 :使用大括号包裹捕获组编号

$ {2}1   // 注意中间不能有空格

C# 替换字符串写成:

Regex.Replace(input, "(.+)@(.+)", "${2}1");

结果为:

021


CL 最后更新于 3天22小时前
白云朔 回复 CL 3天11小时前 :

经过测试,已正常运行。
但是这个写法感觉似乎不同编程语言都有较大不同,并且${XX}通常是命名组的写法,$编号 后紧跟数字在某些正则测试网站的默认编程语言模式中是被支持的,建议C大您看一下是否在模块文档中写一下引用捕获组的用法即注意事项会好一些。

CL 回复 白云朔 3天10小时前 :

正则涉及相当多的知识,qk文档目前都没有包含这部分,也不太适合单独说这个。等以后如果加正则部分的文档再考虑了

回复主贴