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

如何用单个正则表达式一次性匹配指定格式字符串的三类目标内容?

用单个正则一次性提取三类内容的解决方案

你之前用|拼接正则的方式属于分支匹配,每次只能匹配三类内容中的一个,而且还重复写了第二个分支,导致完全没覆盖文本部分,所以无法一次性获取全部目标信息。

正确的思路是匹配整行结构,用捕获组分别提取三个目标内容,这样每次匹配就能拿到所有需要的信息。

解决方案正则

针对你的字符串格式,构造包含三个捕获组的正则:

const regex = /^\d+\s+\[(\d+\.\d+)\s-\s(\d+\.\d+)\]\s+(.*)$/gm;

正则各部分含义:

  • ^\d+\s+:匹配行首的数字序号和后续空格
  • \[(\d+\.\d+)\s-\s:匹配[,然后捕获第一个带小数点的数值,接着匹配空格分隔的-
  • (\d+\.\d+)\]\s+:捕获第二个带小数点的数值,然后匹配]和后续空格
  • (.*)$:捕获] 之后的所有文本直到行尾

代码示例

方法1:使用matchAll一次性获取所有行的结果

const str = `5 [105.68 - 143.759] some text
6 [143.759 - 173.88] some text
7 [173.88 - 201.839] some text`;

const regex = /^\d+\s+\[(\d+\.\d+)\s-\s(\d+\.\d+)\]\s+(.*)$/gm;
const allMatches = [...str.matchAll(regex)];

allMatches.forEach(item => {
  const firstNum = item[1];   // 第一个数值,如105.68
  const secondNum = item[2];  // 第二个数值,如143.759
  const text = item[3];       // 后续文本,如some text
  console.log(`提取结果:${firstNum} | ${secondNum} | ${text}`);
});

方法2:使用exec循环逐行提取

const str = `5 [105.68 - 143.759] some text
6 [143.759 - 173.88] some text
7 [173.88 - 201.839] some text`;

const regex = /^\d+\s+\[(\d+\.\d+)\s-\s(\d+\.\d+)\]\s+(.*)$/gm;
let matchResult;
while ((matchResult = regex.exec(str)) !== null) {
  console.log(`第一个数值:${matchResult[1]}`);
  console.log(`第二个数值:${matchResult[2]}`);
  console.log(`文本内容:${matchResult[3]}`);
  console.log('---');
}

扩展优化

如果你的数值可能包含整数(无小数点),可以把正则中的\d+\.\d+替换为\d+(?:\.\d+)?,适配更多数值格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:18:20