如何使用单个正则表达式匹配不同顺序的子组并提取目标内容
单正则提取特定结构字符串片段
问题描述
现有一类字符串符合以下两种结构之一:
(\w+){1}([!][a-zA-Z0-9>,]+)*([#]\d+)? (\w+){1}([#]\d+)?([!][a-zA-Z0-9>,]+)*
字符串示例如下:
"Abc1!deF2>Ghi3,4jlmNO!pQr5st#1400" "Abc1#1400!deF2>Ghi3,4jlmNO!pQr5st"
预期的提取结果按字符串内的出现顺序排列,如下:
["Abc1", "!deF2>Ghi3,4jlmNO", "!pQr5st", "#1400"] ["Abc1", "#1400", "!deF2>Ghi3,4jlmNO", "!pQr5st"]
原实现通过3个正则分别匹配不同段,需要改为单个正则实现同等效果。
实现方案
使用带全局匹配模式的多分支正则即可实现,代码如下:
// 单个正则表达式 const matchReg = /^\w+|![a-zA-Z0-9>,]+|#\d+/g; // 测试用例1 const str1 = "Abc1!deF2>Ghi3,4jlmNO!pQr5st#1400"; console.log(str1.match(matchReg)); // 输出:["Abc1", "!deF2>Ghi3,4jlmNO", "!pQr5st", "#1400"] // 测试用例2 const str2 = "Abc1#1400!deF2>Ghi3,4jlmNO!pQr5st"; console.log(str2.match(matchReg)); // 输出:["Abc1", "#1400", "!deF2>Ghi3,4jlmNO", "!pQr5st"]
正则规则说明
^\w+:匹配字符串开头的首个单词段,限制开头位置避免其他位置的独立单词被误捕获![a-zA-Z0-9>,]+:匹配所有以!开头、后续字符为字母/数字/>/,的功能段#\d+:匹配所有以#开头、后续为纯数字的标记段
全局匹配模式g会从左到右扫描整个字符串,按出现顺序返回所有命中的片段,正好符合预期的输出顺序要求。
内容的提问来源于stack exchange,提问作者Syffys
相关产品推荐
相关产品推荐

