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

JavaScript正则表达式:捕获整个列表为单个匹配项

解决JavaScript中用正则捕获完整列表块的问题

嘿,我懂你现在的需求——要把连续的星号开头的列表项整合成完整的列表块,这样就能区分开不同的列表,各自从1开始计数对吧?之前你尝试的((^\*[^\*](.*)$)+)没达到预期,其实是因为正则默认的匹配规则限制了它跨行的能力,我来给你拆解下解决方案:

问题根源

你之前的正则里,.*默认是不匹配换行符的,所以即便用了+重复捕获组,也只能抓到单行的列表项,没法把连续的多行列表项合并成一个块。而且空行作为不同列表的分隔符,也需要正则能识别“连续的星号行”和“空行分隔”的边界。

可行的正则方案

我们可以写一个匹配连续星号开头行的正则,把每个完整的列表块单独捕获出来:

const listBlockRegex = /^\*[^\n]*(?:\n\*[^\n]*)*$/gm;

这个正则的拆解:

  • ^:在m(多行)模式下匹配行首
  • \*[^\n]*:匹配单行列表项——从*开始,到该行末尾([^\n]匹配除换行外的所有字符)
  • (?:\n\*[^\n]*)*:非捕获组,匹配零或多个后续的列表项行(前面必须带换行符,确保是连续的列表)
  • $:在m模式下匹配行尾
  • gm:全局匹配(抓所有列表块)+ 多行模式(让^/$作用于每行)

实际使用示例

把这个正则用到你的字符串处理里,就能轻松区分不同列表并计数了:

// 示例文本,包含两个独立列表
const inputText = `* 第一个列表项
* 第二个列表项

* 另一个列表的第一项
* 另一个列表的第二项
* 第三个项`;

// 捕获所有完整列表块
const allLists = inputText.match(listBlockRegex) || [];

// 遍历每个列表块,单独计数
allLists.forEach((listBlock, listIndex) => {
  // 把列表块拆成单个项
  const items = listBlock.split('\n');
  console.log(`第 ${listIndex + 1} 个列表,共 ${items.length} 项:`);
  
  items.forEach((item, itemIndex) => {
    // 去掉开头的*和空格,输出带序号的内容
    const content = item.replace(/^\*\s*/, '');
    console.log(`${itemIndex + 1}. ${content}`);
  });
});

运行这段代码后,你会看到两个列表分别被处理,各自从1开始计数,完美区分开了空行分隔的不同列表。

如果你的列表项里有内部换行(比如软换行),可以稍微调整正则,把[^\n]换成[\s\S]来匹配所有字符(包括换行),不过这个场景下应该用不到~

内容的提问来源于stack exchange,提问作者Adam Ilčišák

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:15:36