为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 按空格分割忽略括号

JavaScript 按空格分割忽略括号

有只小跳蛙 2023-07-06 15:06:14
我试图按空格分割字符串,但忽略括号中或左括号后的字符串。例如,如果括号是平衡的,则该解决方案可以正常工作:// original stringlet 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 stringlet 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']我应该如何实现这个目标?
查看完整描述

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


查看完整回答
反对 回复 2023-07-06
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信