javascript - 正则表达式封装不在括号内的内容

标签 javascript regex replace

我的目标是,正如标题所说,将不在括号内的所有内容封装在括号内,如下所示:

@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

最佳答案

您可以使用 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);

关于javascript - 正则表达式封装不在括号内的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509315/

相关文章:

java - 在 Java 中使用 .replace(char oldChar, char newChar)

javascript - 使用带有 Promise 的 Express.js 端点

在 setTimeout 中调用 Javascript 函数 - 哪个更好?

javascript - 我可以在我的 CSS 样式表中链接外部 javascript 吗?

regex - 我的 ($H,$M,$S) = $date =~ m{^([0-9]{2}) :([0-9]{2}):([0-9]{2})} in perl 的含义

c# - 替换字符串中的几个不同字符

java - 字符串替换方法不起作用

javascript - 有没有办法使用 Javascript 代码自动切换浏览器字体设置?

php - 计算单词在文本中的出现次数

JavaScript 样式/优化 : String. indexOf() v. Regex.test()