如何用单个正则表达式一次性匹配指定格式字符串的三类目标内容?
用单个正则一次性提取三类内容的解决方案
你之前用|拼接正则的方式属于分支匹配,每次只能匹配三类内容中的一个,而且还重复写了第二个分支,导致完全没覆盖文本部分,所以无法一次性获取全部目标信息。
正确的思路是匹配整行结构,用捕获组分别提取三个目标内容,这样每次匹配就能拿到所有需要的信息。
解决方案正则
针对你的字符串格式,构造包含三个捕获组的正则:
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
相关产品推荐
相关产品推荐

