1 回答
TA贡献1951条经验 获得超3个赞
我们可以通过在末尾添加缺少的括号来平衡字符串。
请注意,像这样的情况
"attribute1 in (a, b, c attribute2 in (d, e"
会导致
[ 'attribute1', 'in', '(a,', 'b,', 'c', 'attribute2', 'in', '(d, e' ]
并且该解决方案假定这是预期的结果。
如果是 - 这是解决方案:
/**
* @param {string} s
* @returns {string[]}
*/
function split(s) {
let unclosed_count = 0;
// count unclosed parentheses
for (let i = 0; i < string.length; i++) {
if (s[i] == '(') {
unclosed_count++;
} else if (s[i] == ')') {
unclosed_count--;
}
}
// close off the parentheses
for (let i = 0; i < unclosed_count; i++) {
s += ')';
}
// split
let words = s.split(/(?!\(.*)\s(?![^(]*?\))/g);
// remove the added parentheses from the last item
let li = words.length - 1;
words[li] = words[li].slice(0, -unclosed_count);
return words;
}
let string = 'attribute1 in (a, b, c) attribute2 in (d, e';
let words = split(string);
console.log(words);
// => [ 'attribute1', 'in', '(a, b, c)', 'attribute2', 'in', '(d, e' ]
干杯!
还值得考虑的情况是,不是左括号(
不匹配,而是存在一些右括号)
不匹配。
IE"attribute1 in a, b, c) attribute2 in d, e)"
问题中没有提到这一点,因此它也不在解决方案中,但如果这很重要,您需要对 ie 执行与我们相同的操作unclosed_count
,但相反unopened_count
。
添加回答
举报