我的目标是,正如标题所说,将括号内的所有内容都包含在括号内,如下所示:
@tdWrap@ something here @tdWrapEnd@
这是我到目前为止所做的:
var str = '1+[2/3]-23+2+<3,4,[22/7]+2;2,3,4>+2';
var indices = str.split(/\[[^\]]*\]|<[^>]*>/);
var tdWrapper = [];
for (var i = 0; i < indices.length; i++) {
tdWrapper[i] = '@tdWrap@' + indices[i] + '@tdWrapEnd@'
}
for (var i = 0; i < indices.length; i++) {
indices[i] = indices[i].replace(/([\+\-\*\?])/g, '\\$1')
}
var regObj;
for (var i = 0; i < indices.length; i++) {
regObj = new RegExp(indices[i]);
str = str.replace(regObj, tdWrapper[i])
}
问题是当我在字符串中替换有重复项时,所以我无法替换正确的东西。这是我想要结束的字符串:
@tdWrap@1+@tdWrapEnd@[2/3]@tdWrap@-23+2+@tdWrapEnd@<3,4,[22/7]+2;2,3,4>@tdWrap@+2@tdWrapEnd@
但这是我最终的字符串:
@tdWrap@1+@tdWrapEnd@[2/3]@tdWrap@-23@tdWrap@+2@tdWrapEnd@+@tdWrapEnd@<3,4,[22/7]+2;2,3,4>+2
答案 0 :(得分:2)
您可以使用replace
方法和闭包来完成此操作。您需要将要跳过的所有内容放入捕获组中以将其返回:
var str = '1+[2/3]-23+2+<3,4,[22/7]+2;2,3,4>+2';
var result = str.replace(/[0-9+*\/-]+|(\[[^\]]*\]|<[^>]*>)/g, function (m, g1) {
if (g1 == undefined) return '@tdWrap@' + m + '@tdWrapEnd@';
return g1;
});
console.log(result);