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

如何用正则仅统计字符串中连续分号序列?可附加双引号限定条件

解决连续分号序列匹配与统计问题

问题分析

你原有的代码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:05:07