我想根据空格将一个字符串分隔成一个数组,需要注意的是一对大括号或方括号内的空格应该被忽略。
我能够找到一些接近我想要的答案 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}"]
当使用 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/