如何使用JS正则按双花括号数组正确分割字符串?
问题原因与修正方案
失败原因
- 单词边界
\b不适用:\b匹配的是「单词字符(字母、数字、下划线)和非单词字符的分界」,但{{test}}开头的{是非单词字符,它前面的空格也是非单词字符,两者之间不存在单词边界;同理结尾的}和后面的空格之间也没有单词边界,导致你的regex2根本匹配不到任何内容,split自然不会分割原字符串。 - 特殊字符未转义:
{{test}}里的{和}是正则的特殊语法字符(用来表示量词,比如{2,3}),直接拼进new RegExp时,正则引擎会把{{当成语法错误处理,进一步导致匹配失败。
修正方法
方法一:直接用原匹配正则分割(最简单)
既然你已经有了匹配{{...}}的正则,直接用它来split就行——只要给正则加上捕获组,split就会把匹配到的分隔符(也就是{{test}}这类内容)也加入结果数组:
let str = 'This is a {{test}} string with {{multiple}} matches.'; let regex = /({{.+?}})/g; // 给整个匹配内容加捕获组 let substrings = str.split(regex); console.log(substrings); // 输出:["This is a ", "{{test}}", " string with ", "{{multiple}}", " matches."]
方法二:修正基于matches数组的正则构建
如果一定要用matches数组来生成分割正则,需要做两个调整:
- 去掉无用的
\b; - 对每个匹配项做正则转义,把特殊字符转成字面量:
let str = 'This is a {{test}} string with {{multiple}} matches.'; let regex = /\{\{(.+?)\}\}/g; let matches = str.match(regex); // 正则转义函数:把特殊字符转成字面量 function escapeRegex(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // 构建正确的分割正则 let regex2 = new RegExp(matches.map(escapeRegex).join('|'), 'gi'); let substrings = str.split(regex2); console.log(substrings); // 输出:["This is a ", "{{test}}", " string with ", "{{multiple}}", " matches."]
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

