javascript - 按空格拆分字符串,除非空格位于最浅层的大括号或方括号内

标签 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,而且它也没有类似的字符模式来调整答案。

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

最佳答案

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

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

示例代码

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

请注意,上述代码几乎肯定不会处理您可能拥有的所有可能要求或您可能遇到的边缘情况。 (例如,不平衡的方括号/花括号可​​能不会按照您期望的方式处理。)但是如果您了解它在做什么,那么您应该能够调整它以满足您的需要。我希望这有帮助! :)

关于javascript - 按空格拆分字符串,除非空格位于最浅层的大括号或方括号内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256149/

相关文章:

javascript - 将 Flask 变量直接传递给 vue 的最佳方式是什么?

仅用于整个单词的 PHP 正则表达式

java - ANTLR 正则表达式中的范围量词语法

java - XSD 中的模式验证是否不同?

java - 在 x 个制表符后分割字符串

javascript - 我可以在一段时间后隐藏或关闭 JavaScript 警报吗?

javascript - 告诉 Symfony 的 Request 某些 ajax 请求(jquery 的 $.get(path, cb) 请求)是 "X-Requested-With"等于 "XMLHttpRequest"的请求?

javascript - PHP:使用编辑的行更新 JS 文件

python - 有没有办法将字符串从基于行空间的文件中拆分出来?

java - 组合 Xml 字符串拆分 Java