如何用正则分割字符串为数组?Regexr与JS正则匹配差异及实例解决
要得到你预期的仅以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默认可能开启了dotall(让.匹配换行)或multiline模式,但JavaScript中这些特性需要显式添加s或m修饰符才会生效。比如你在regexr里用.能匹配换行,但JS默认情况下.是不识别换行的。捕获组显示差异
regexr的匹配结果会直观展示所有捕获组的内容,但JavaScript中如果使用g全局修饰符,match()方法只会返回整个匹配的字符串数组,不会单独返回捕获组的内容(如果需要获取捕获组,得用exec()循环遍历)。语法支持超前性
regexr可能提前支持了一些尚未在所有JS环境普及的正则特性,而JavaScript仅严格支持ECMAScript标准中定义的特性(比如ES2018才引入的反向预查,旧版JS就无法使用)。空白字符的可视化差异
regexr的界面可能会自动优化空白字符的显示,但JavaScript会严格匹配所有字符,包括换行、制表符、空格等,这可能导致可视化结果和实际JS运行结果出现细微差异。
内容的提问来源于stack exchange,提问作者Tom Le

