JavaScript RegExp:匹配所有特定字符,忽略嵌套括号

时间:2019-06-10 15:23:41

标签: javascript regex

实际上,我需要用whitespaces分隔此行,而忽略括号中的内容(可以嵌套):

var string = 'a b c(a b c) d(a (b) c)'

进入此数组:

['a', 'b', 'c(a b c)', 'd(a (b) c)']

我的任务的实质是获取所有由空格分隔的变量和函数调用的列表

因此,用空格分开,括号中的所有内容都应忽略

我知道问这样的问题是多么愚蠢,但是对于正则表达式,我完全傻了,如果那样的话,准备等着开始赏金)Thx)

也许应该是这样的:

string = 'a b c(a b c) d(a (b) c)'.relaceWhitespacesinParentheses('&wh;')

// 'a b c(a&wh;b&wh;c) d(a&wh;(b)&wh;c)'

string.split(' ')

// ['a', 'b', 'c(a&wh;b&wh;c)', 'd(a&wh;(b)&wh;c)']

接下来的一切都很明显

3 个答案:

答案 0 :(得分:4)

var str = 'a b d(a (b) c) c(a b c)   e(a (f t(o a i) ) ) ';
str = str.trim();
var result = [];
var open_bracket = 0;
var curr_str = '';

for (var i = 0; i < str.length; ++i) {
  if (str.charAt(i) === '(') open_bracket++;
  if (str.charAt(i) === ')') open_bracket--;

  if (str.charAt(i) == ' ') {
    if (open_bracket == 0 && curr_str != '') {
      result.push(curr_str);
      curr_str = '';
    } else if (open_bracket > 0) {
      curr_str += str.charAt(i);
    }
  } else {
    curr_str += str.charAt(i);
  }
}

result.push(curr_str); // to include the last matched token.
console.log(result);

我们在字符串中逐个字符地移动。找到空间后,通过检查是否有方括号来查看是否需要将其容纳在输出结果中。如果是,则将其附加到临时结果curr_str上,否则,将当前curr_str添加到结果中。

答案 1 :(得分:3)

如果最多嵌套一层,则可以尝试this pattern

var str = 'a b c(a b c) d(a (b) c)';

var res = str.match(/\w+\([^)(]*(?:\([^)(]*\)[^)(]*)*\)|\S+/g);

console.log(res);

您需要将每个层次的更深层嵌套添加到模式中。例如with max two levelsfyi)。

答案 2 :(得分:3)

也许是这样?可能有更整齐的方式

var string = 'a b c(a b c) d(a (b (a b c) d) c)'
var split = string.split(' ')

var numberOfBrackets = 0
var elements = []
split.reduce(function (acc, cur) {
  if (cur.includes('(')) {numberOfBrackets++}
  if (cur.includes(')')) {numberOfBrackets--}
  if (numberOfBrackets !== 0) {
    return acc + ' ' + cur
  } else {
    elements.push((acc + ' ' + cur).trim())
  }
  return ''
}, '')

console.log(elements)