正则表达式:如何返回不在括号中的匹配项

时间:2016-04-12 01:01:09

标签: javascript regex

所以我在技术上已经解决了这个问题,但我希望使用一些时髦的正则表达式来提供更好的解决方案。

问题是: 我们得到了这个字符串:

2+ {2+(2)},

10+(20 + 2)+2

目标是匹配' plus'没有任何支架的标志。 即在之前的字符串中它应匹配

2 + {2+(2)},

10 + (20 + 2) + 2

目前我正在做的是匹配所有加号,然后检查标志是否在它前面有任何括号(使用正则表达式),如果它确实然后摆脱它

我希望有一个更整洁的正则表达式解决方案,这可能吗?

重申一下,我需要字符串的位置,目前我正在使用javascript来执行此操作,所以理想情况下首选js解决方案,但模式确实是我正在寻找的。

1 个答案:

答案 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 +                                           "