所以我在技术上已经解决了这个问题,但我希望使用一些时髦的正则表达式来提供更好的解决方案。
问题是: 我们得到了这个字符串:
2+ {2+(2)},
10+(20 + 2)+2
目标是匹配' plus'没有任何支架的标志。 即在之前的字符串中它应匹配
2 + {2+(2)},
10 + (20 + 2) + 2
目前我正在做的是匹配所有加号,然后检查标志是否在它前面有任何括号(使用正则表达式),如果它确实然后摆脱它
我希望有一个更整洁的正则表达式解决方案,这可能吗?
重申一下,我需要字符串的位置,目前我正在使用javascript来执行此操作,所以理想情况下首选js解决方案,但模式确实是我正在寻找的。 p>
答案 0 :(得分:1)
您可以用空格替换()
或{}
内的所有内容:
'10 + (20+2) + 2'.replace(/\([^)]*?\)|\{[^}]*?\}/g, m => ' '.repeat(m.length));
这会导致
10 + + 2
意思是不改变字符串的位置。
注意:对于相同类型的嵌套内容(ex (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 + "