所以我在技术上已经解决了这个问题,但我希望使用一些时髦的正则表达式找到更好的解决方案。
问题是: 我们得到了这样的字符串:
2+{2+(2)},
10+(20+2)+2
目标是匹配不在任何括号中的“加号”。 即在前面的字符串中它应该匹配
2 + {2+(2)} ,
10 + (20+2) + 2
目前我正在做的是匹配所有加号,然后检查该符号前面是否有括号(使用正则表达式),如果有则删除它。
我希望有一个更简洁的正则表达式解决方案,这可能吗?
重申一下,我需要字符串的位置,目前我正在使用 javascript 来执行此操作,因此理想情况下首选 js 解决方案,但该模式确实是我正在寻找的。p>
最佳答案
您也许可以将 ()
或 {}
中的所有内容替换为空格:
'10 + (20+2) + 2'.replace(/\([^)]*?\)|\{[^}]*?\}/g, m => ' '.repeat(m.length));
这会导致
10 + + 2
意味着字符串的位置没有改变。
注意:它不能很好地处理相同类型的嵌套事物,例如 (1 + (1 + 1) + 1)
,但它可以与 (1 + { 1 + 1 } + 1)
。
更大的解决方案,使用相同的逻辑,但适用于嵌套内容
var input = '10 + { 1 + (20 + (1 + { 3 + 3 } + 1) + 2) + 2 }';
var result = [];
var opens = 0;
for (var i = 0; i < input.length; ++i) {
var ch = input[i];
if (/\(|\{/.test(ch)) {
opens++;
result[i] = ' ';
}
else if (/\)|\}/.test(ch)) {
opens--;
result[i] = ' ';
}
else {
if (!opens) result[i] = input[i];
else result[i] = ' ';
}
}
result = result.join('');
// "10 + "
关于javascript - 正则表达式:如何返回不在括号中的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36561831/