如何用正则仅统计字符串中连续分号序列?可附加双引号限定条件
解决连续分号序列匹配与统计问题
问题分析
你原有的代码const scMatchesLength = v.match(/[;]+/)?.[0].length;存在两个核心问题:
- 仅匹配第一个连续分号序列,无法覆盖所有符合要求的连续多加分号场景
- 会匹配单个分号,不符合你需要的「连续多个分号(如
;;;;)」的筛选要求
同时你需要附加规则:匹配的连续分号序列前后可带有双引号。
解决方案
1. 匹配任意位置的连续2个及以上分号
使用正则/;{2,}/g({2,}表示匹配至少2个连续分号,g修饰符实现全局匹配所有符合序列),再按需统计长度:
// 获取所有连续≥2个分号的序列 const continuousSemicolons = v.match(/;{2,}/g); // 统计最长的连续分号序列长度(也可遍历处理所有序列) const maxSemicolonLength = continuousSemicolons ? Math.max(...continuousSemicolons.map(seq => seq.length)) : 0;
例如在字符串"abc;;;;def;;ghi"中,会匹配到;;;;和;;,最终最长长度为4。
2. 匹配前后带有双引号的连续分号序列
分两种常见场景处理:
场景A:连续分号被双引号直接包裹(如";;;;")
使用正则/"(;{2,})"/g,捕获组内为纯分号序列,无需额外处理引号:
// 获取所有被双引号包裹的连续≥2个分号的匹配项 const quotedSemicolons = v.match(/"(;{2,})"/g); // 提取分号序列的长度 const quotedLengths = quotedSemicolons ? quotedSemicolons.map(match => match.slice(1, -1).length) : []; // 取最长长度 const maxQuotedLength = quotedLengths.length ? Math.max(...quotedLengths) : 0;
场景B:连续分号前后可紧邻双引号(如";;;;"或;;;;")
使用正则/"?;{2,}"?/g,之后去除匹配结果中的双引号再统计长度:
const semiMatches = v.match(/"?;{2,}"?/g); const semiLengths = semiMatches ? semiMatches.map(match => match.replace(/"/g, '').length) : []; const maxLength = semiLengths.length ? Math.max(...semiLengths) : 0;
针对你的示例字符串测试
你的示例字符串:123 "321"####(x)##;654 "654" "456"####(-)##, ;"
其中仅存在两个单独分号,无连续2个及以上的分号,因此上述代码的结果均为0,符合你「仅统计连续多加分号」的需求。
内容的提问来源于stack exchange,提问作者Bardelman
相关产品推荐
相关产品推荐

