用正则将字符串分割成数组

给出字符串

var string = "${foo}bar${bar}foo";

如何分割得到

var result = ["${foo}", "bar", "${bar}", "foo"];
阅读 16.1k
8 个回答
'${foo}bar${bar}foo'
.split(/(\$\{\w+\})/)
.filter(function(str){
    return str !== ''
})
// 用match即可。没有必要split来分割,再对数组进行filter等操作
var str = '${foo}bar${bar}foo';
var str2 = 'foo${foo}${bar}bar${bar}${bar}foo';

var reg = /(\$\{[^\}]*\})|(\w+)/g;
var result = str.match(reg);
var result2 = str2.match(reg);

console.log(result);
// ["${foo}", "bar", "${bar}", "foo"]

console.log(result2);
// ["foo", "${foo}", "${bar}", "bar", "${bar}", "${bar}", "foo"]

一般人字符串不会那么写,如果要后面方便处理的话

如果字符串确实如此规律的话
不用正则,用$和}切割即可

string.split('$')  // 以$切割
    .map(str => str.split('}'))  // 以}切割
    .reduce((a, b) => a.concat(b),[]) // 合并数组
    .filter(s => s !== '')  // 过滤空字符串
    .map(s => s.startsWith('{') ? '$'+s+'}' : s) // 把切割掉的符号补回来
"${foo}bar${bar}foo".replace(/(\${\w+(?:}))/g, '|$1|').split('|').filter(s => s !== '')
输出 ["${foo}", "bar", "${bar}", "foo"]

"${sxx${foo}bar${bar}foo}".replace(/(\${\w+(?:}))/g, '|$1|').split('|').filter(s => s !== '')
输出 ["${sxx", "${foo}", "bar", "${bar}", "foo}"]
var result = string.match(/\${[^}]*}|[^\${]+/g);
'${foo}bar${bar}foo'.match(/\${[^}]*}|\w+/g);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏