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

如何创建可将每个{arg\d}匹配为独立分组的正则表达式?

如何提取字符串中所有{arg\d}并作为独立项处理

嘿,刚接触正则的话确实容易被分组这个概念绕晕,我来帮你理清楚~

首先得澄清一个正则里的常见误区:正则的捕获分组数量是在写模式时就固定好的,没办法做到“有几个匹配项就生成几个分组”(比如一行3个参数就出3个分组,1个就出1个)。不过别担心,我们可以换个思路——直接提取所有符合{arg\d}格式的匹配项,每个自然就是独立的结果啦。

第一步:写匹配单个{arg\d}的正则模式

要匹配{arg1}、{arg2}这类格式,正则可以这么写:

\{arg\d+\}

拆解一下每个部分的作用:

  • \{ 和 \}:因为{和}是正则的特殊字符(用来表示重复次数),所以要加反斜杠转义,才能匹配字面量的大括号
  • arg:匹配字符串里的字面量"arg"
  • \d+:匹配一个或多个数字(\d代表数字,+表示至少出现一次)

如果你还想单独提取里面的数字(比如从{arg1}里拿到1),可以给数字部分加个捕获分组:

\{arg(\d+)\}

第二步:提取所有匹配项

接下来根据你用的编程语言,用对应的方法提取所有符合模式的内容就行,举两个常见语言的例子:

Python 示例

用re.findall()可以直接拿到所有匹配结果:

import re
text = "some value {arg1} {arg2} {arg3} another value {arg1} idkhere {arg1} {arg2}"
# 提取完整的{arg\d}
full_matches = re.findall(r'\{arg\d+\}', text)
print(full_matches)
# 输出: ['{arg1}', '{arg2}', '{arg3}', '{arg1}', '{arg1}', '{arg2}']

# 只提取数字部分
num_matches = re.findall(r'\{arg(\d+)\}', text)
print(num_matches)
# 输出: ['1', '2', '3', '1', '1', '2']

JavaScript 示例

用matchAll()配合扩展运算符来提取所有匹配:

const text = "some value {arg1} {arg2} {arg3} another value {arg1} idkhere {arg1} {arg2}";
// 匹配完整的{arg\d}
const fullRegex = /\{arg\d+\}/g;
const fullMatches = [...text.matchAll(fullRegex)].map(item => item[0]);
console.log(fullMatches);
// 输出: ["{arg1}", "{arg2}", "{arg3}", "{arg1}", "{arg1}", "{arg2}"]

// 只提取数字部分
const numRegex = /\{arg(\d+)\}/g;
const numMatches = [...text.matchAll(numRegex)].map(item => item[1]);
console.log(numMatches);
// 输出: ["1", "2", "3", "1", "1", "2"]

关于“动态分组”的补充(不推荐)

如果你真的想尝试通过正则生成对应数量的分组,那只能针对可能出现的参数数量写分支模式,比如最多3个参数的话:

^(.*?)(\{arg\d+\})(.*?)(\{arg\d+\})?(.*?)(\{arg\d+\})?$

但这种方式非常死板——如果字符串里出现4个参数,这个模式就没法捕获第4个了,而且分组里还会包含很多无关的文本,所以完全不推荐用这种方法,还是提取所有匹配项的方式更灵活实用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:06