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

如何用正则表达式从指定格式字符串中提取值到数组?

解决双层括号内多组内容的正则提取问题

你的原正则表达式之所以无法处理多组情况,核心问题在于[^)]+这个匹配规则:它会匹配第一个)之前的所有字符,遇到多组里的)就会提前终止匹配,自然只能拿到第一组的内容。

下面给你两种实用的解决方案,都能完美适配单组/多组的输入场景:

方案一:分两步处理(更直观易调试)

先提取外层((和))之间的全部内容,再从中逐个提取每组的核心值:

步骤说明

  1. 用正则/\(\((.*?)\)\)/提取外层括号包裹的内部字符串(.*?是非贪婪匹配,确保只拿到((和))之间的内容)
  2. 对提取到的内部字符串,用/\(([^)]+)\)/g全局匹配每个带括号的组,再去掉每组的前后括号得到最终值

代码示例(以JavaScript为例)

const input = '((111111111111),(222222222),(333333333333333))';
// 第一步:取出外层括号内的所有内容
const innerStrMatch = input.match(/\(\((.*?)\)\)/);

if (innerStrMatch) {
  const innerContent = innerStrMatch[1];
  // 第二步:提取每个组的内容并去掉括号
  const resultArray = innerContent.match(/\(([^)]+)\)/g)?.map(item => item.slice(1, -1)) || [];
  console.log(resultArray); 
  // 输出:["111111111111", "222222222", "333333333333333"]
}

// 单组输入测试:((111111))
const singleInput = '((111111))';
const singleInnerMatch = singleInput.match(/\(\((.*?)\)\)/);
if (singleInnerMatch) {
  const singleResult = singleInnerMatch[1].match(/\(([^)]+)\)/g)?.map(item => item.slice(1, -1)) || [];
  console.log(singleResult); // 输出:["111111"]
}

方案二:一步到位的全局匹配(更简洁)

利用正向断言来精准定位每个组的前后边界,直接全局匹配出所有目标值:

正则表达式

/(?<=\(\(|,\()([^)]+)(?=\)|,\))/g

规则解释

  • (?<=\(\(|,\():正向预查,确保当前位置前面是(((第一组的开头)或者,((后续组的开头)
  • ([^)]+):捕获每组的核心内容(除了)之外的所有字符)
  • (?=\)|,\)):正向预查,确保当前位置后面是)(组的结尾)或者,)(后续组的分隔)

代码示例(以JavaScript为例)

const input = '((111111111111),(222222222),(333333333333333))';
const resultArray = input.match(/(?<=\(\(|,\()([^)]+)(?=\)|,\))/g);
console.log(resultArray); 
// 输出:["111111111111", "222222222", "333333333333333"]

// 单组输入测试
const singleInput = '((111111))';
const singleResult = singleInput.match(/(?<=\(\(|,\()([^)]+)(?=\)|,\))/g);
console.log(singleResult); // 输出:["111111"]

注意事项

如果你的开发环境不支持正向断言(比如旧版本的Python),建议优先使用方案一,兼容性更好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:47