除非空格在最浅层的大括号或方括号内,否则用空格分隔字符串

时间:2018-07-10 01:40:21

标签: javascript regex split

我想基于空格将字符串分成数组,但要注意,一对大括号或方括号内的空格应忽略。

我能够找到一些与我想要的herehere接近的答案,但它们不能处理嵌套在其他括号内的括号。

如何拆分此字符串:

foo bar["s 1"]{a:{b:["s 2", "s 3"]}, x:" [s 4] "} woo{c:y} [e:{" s [6]"}] [simple square bracket] {simple curly bracket}

进入这个数组?

["foo", "bar[\"s 1\"]{a:{b:[\"s 2\", \"s 3\"]}, x:\" [s 4] \"}", "woo{c:y}", "[e:{\" s [6]\"}]", "[simple square bracket]", "{simple curly bracket}"]

在使用first link中的正则表达式时,我修改了正则表达式以使用方括号和大括号,并获得了示例中简单,非嵌套部分的正确输出,但不适用于复杂的部分嵌套区域。 See here

second link's的答案依赖于冒号的JSON格式,因此它不适用,因为我的输入不一定是有效的JSON,并且也没有类似的字符模式来适应答案。

根据评论者,使用正则表达式可能无法做到这一点。即使是这种情况,将字符串拆分以实现所需结果的任何方式都将被视为正确答案。

1 个答案:

答案 0 :(得分:1)

正则表达式对某些事物很有用。但是,如果您希望支持任意深度嵌套的表达式,那么正则表达式并不是真正适合此工作的工具。

相反,请考虑以下方法,该方法使用堆栈来跟踪带括号的表达式的开始和结束:

示例代码

function getfugu_split(input) {
  var i = 0, stack = [], parts = [], part = '';
  while(i < input.length) {
    var c = input[i]; i++;  // get character
    if (c == ' ' && stack.length == 0) {
      parts.push(part.replace(/"/g, '\\\"'));  // append part
      part = '';  // reset part accumulator
      continue;
    }
    if (c == '{' || c == '[') stack.push(c);  // begin curly or square brace
    else if (c == '}' && stack[stack.length-1] == '{') stack.pop();  // end curly brace
    else if (c == ']' && stack[stack.length-1] == '[') stack.pop();  // end square brace
    part += c; // append character to current part
  }
  if (part.length > 0) parts.push(part.replace(/"/g, '\\\"'));  // append remaining part
  return parts;
}

用法示例

getfugu_split('foo bar["s 1"]{a:{b:["s 2", "s 3"]}, x:" [s 4] "} woo{c:y} [e:{" s [6]"}] [simple square bracket] {simple curly bracket}')

输出

["foo", "bar[\"s 1\"]{a:{b:[\"s 2\", \"s 3\"]}, x:\" [s 4] \"}", "woo{c:y}", "[e:{\" s [6]\"}]", "[simple square bracket]", "{simple curly bracket}"]

请注意,以上代码几乎可以肯定不会处理您可能遇到的所有可能要求或可能遇到的情况。 (例如,可能无法按照您期望的方式来处理不平衡的方括号/花括号。)但是,如果您了解它的作用,则应该能够对其进行调整以适合您的需求。我希望这有帮助! :)