【问题标题】:Split string by all spaces except those in parentheses用除括号中的空格外的所有空格分割字符串
【发布时间】:2017-04-25 19:50:30
【问题描述】:

我正在尝试在空格上拆分以下文本:

var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}"

但我希望它忽略括号内的空格。这应该产生一个数组:

var words = ["Text", "(what is)|what's", "a", "story|fable" "called|named|about", "{Search}|{Title}"];

我知道这应该涉及某种带有 line.match() 的正则表达式。如果正则表达式删除括号,则加分。我知道 word.replace() 会在后续步骤中摆脱它们。

【问题讨论】:

    标签: javascript arrays regex string


    【解决方案1】:

    对特定的正则表达式模式使用以下方法(基于负前瞻断言):

    var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}",
        words = line.split(/(?!\(.*)\s(?![^(]*?\))/g);
      
    console.log(words);
    • (?!\(.*) 确保分隔符 \s 前面没有大括号 ((包括伴随字符)
    • (?![^(]*?\)) 确保分隔符 \s 后面没有大括号 )(包括伴随字符)

    【讨论】:

    • 你能举个例子说明为什么你不能简单地使用\s(?![^(]*?\))
    • 显然第一组似乎没有做任何事情:regex101.com/r/l49ycn/4
    【解决方案2】:

    不是一个单一的正则表达式,而是完成这项工作。删除括号并用空格分割文本。

    var words = line.replace(/[\(\)]/g,'').split(" ");
    

    【讨论】:

    • 但他不想去掉括号。
    • 在问题的末尾有“如果正则表达式删除括号,则奖励积分。”所以我认为这对他来说是一个可选功能。
    • 你是对的。但是您的正则表达式不会在括号内的空格上拆分吗?顺便说一句,字符集中的那些转义是不必要的。
    【解决方案3】:

    在某些情况下有用的一种方法是用占位符替换括号内的空格,然后拆分,然后取消替换:

    var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}";
    
    var result = line.replace(/\((.*?)\)/g, m => m.replace(' ', 'SPACE'))
      .split(' ')
      .map(x => x.replace(/SPACE/g, ' '));
      
    console.log(result);
                     

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2012-02-14
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多