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

如何用正则分割字符串为数组?Regexr与JS正则匹配差异及实例解决

解决方案:提取Sample开头的条目列表

要得到你预期的仅以Sample/SampleN开头的条目列表,使用String.match()配合合适的正则表达式会比split()更直接——因为split()是按分隔符拆分字符串,容易产生空元素或不完整的片段,而match()可以直接提取所有符合模式的完整条目。

具体代码实现

const inputStr = /* 你的原始目标字符串 */;
// 正则规则说明:
// - Sample:匹配以Sample开头的内容
// - [\s\S]*?:非贪婪匹配任意字符(包含换行,兼容不支持ES2018 s修饰符的环境)
// - (?=Sample|$):正向预查,匹配到下一个Sample开头或字符串结尾时停止
const regex = /Sample[\s\S]*?(?=Sample|$)/g;
// 提取后去除每个条目首尾可能存在的空白字符
const result = inputStr.match(regex).map(item => item.trim());

console.log(result);
// 输出就是你预期的11个完整条目组成的数组

如果你的运行环境支持ES2018及以上版本,也可以用更简洁的s修饰符(让.匹配换行),正则可以写成:

const regex = /Sample.*?(?=Sample|$)/gs;

为什么你的当前代码得到23个元素?

你之前用split()的方式,会把每个Sample作为分隔符拆分字符串,这样不仅会把完整条目拆成碎片,还会产生空字符串(比如字符串开头的无内容区域),因此得到了大量多余元素。换成match()直接提取完整匹配项,就能精准得到目标列表。


regexr.com与JavaScript正则的主要差异
  1. 默认修饰符差异
    regexr默认可能开启了dotall(让.匹配换行)或multiline模式,但JavaScript中这些特性需要显式添加s或m修饰符才会生效。比如你在regexr里用.能匹配换行,但JS默认情况下.是不识别换行的。

  2. 捕获组显示差异
    regexr的匹配结果会直观展示所有捕获组的内容,但JavaScript中如果使用g全局修饰符,match()方法只会返回整个匹配的字符串数组,不会单独返回捕获组的内容(如果需要获取捕获组,得用exec()循环遍历)。

  3. 语法支持超前性
    regexr可能提前支持了一些尚未在所有JS环境普及的正则特性,而JavaScript仅严格支持ECMAScript标准中定义的特性(比如ES2018才引入的反向预查,旧版JS就无法使用)。

  4. 空白字符的可视化差异
    regexr的界面可能会自动优化空白字符的显示,但JavaScript会严格匹配所有字符,包括换行、制表符、空格等,这可能导致可视化结果和实际JS运行结果出现细微差异。

内容的提问来源于stack exchange,提问作者Tom Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:19:26