代码之家  ›  专栏  ›  技术社区  ›  getfugu

用空格分隔字符串,除非空格在最浅的一层的花括号或方括号内。

  •  1
  • getfugu  · 技术社区  · 8 年前

    我想将一个字符串分隔成一个基于空格的数组,但需要注意的是,在一对花括号或方括号内的空格应该被忽略。

    我找到了一些接近我想要的答案 here here 但它们不处理嵌套在其他括号内的括号。

    如何拆分此字符串:

    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}"]
    

    使用regex时, first link ,我修改了正则表达式以使用方括号和花括号,并为示例中简单的、未嵌套的部分获得了正确的输出,但不为复杂的嵌套区域提供正确的输出。 See here .

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

    根据一位评论者的说法,这可能与正则表达式无关。即使是这样,为了达到所需的结果而拆分字符串的任何方法都将被视为正确的答案。

    1 回复  |  直到 8 年前
        1
  •  1
  •   porcus    8 年前

    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}"]
    

    推荐文章