猿问

JavaScript 按空格分割忽略括号

我试图按空格分割字符串,但忽略括号中或左括号后的字符串。

例如,如果括号是平衡的,则该解决方案可以正常工作:

// original string

let string = 'attribute1 in (a, b, c) attribute2 in (d, e)';

words = string.split(/(?!\(.*)\s(?![^(]*?\))/g);

console.log(words)

分割后的预期结果:


words = ['attribute1', 'in', '(a, b, c)', 'attribute2', 'in', '(d, e)']

但是,如果括号不平衡,我们可以说:


// original string

let string = 'attribute1 in (a, b, c) attribute2 in (d, e';

那么我期望的结果应该是:


['attribute1', 'in', '(a, b, c)', 'attribute2', 'in', '(d, e']

代替


['attribute1', 'in', '(a, b, c)', 'attribute2', 'in', '(d,', 'e']

我应该如何实现这个目标?


有只小跳蛙
浏览 115回答 1
1回答

饮歌长啸

我们可以通过在末尾添加缺少的括号来平衡字符串。请注意,像这样的情况"attribute1 in (a, b, c attribute2 in (d, e"会导致[ 'attribute1', 'in', '(a,', 'b,', 'c', 'attribute2', 'in', '(d, e' ]并且该解决方案假定这是预期的结果。如果是 - 这是解决方案:/**&nbsp;* @param {string} s&nbsp;* @returns {string[]}&nbsp;*/function split(s) {&nbsp; let unclosed_count = 0;&nbsp; // count unclosed parentheses&nbsp; for (let i = 0; i < string.length; i++) {&nbsp; &nbsp; if (s[i] == '(') {&nbsp; &nbsp; &nbsp; unclosed_count++;&nbsp; &nbsp; } else if (s[i] == ')') {&nbsp; &nbsp; &nbsp; unclosed_count--;&nbsp; &nbsp; }&nbsp; }&nbsp; // close off the parentheses&nbsp; for (let i = 0; i < unclosed_count; i++) {&nbsp; &nbsp; s += ')';&nbsp; }&nbsp; // split&nbsp; let words = s.split(/(?!\(.*)\s(?![^(]*?\))/g);&nbsp; // remove the added parentheses from the last item&nbsp; let li = words.length - 1;&nbsp; words[li] = words[li].slice(0, -unclosed_count);&nbsp; 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。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答