如何创建可将每个{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
相关产品推荐
相关产品推荐

