除了括号内的空格外,将字符串按所有空格分割

5
我正在尝试按空格分割以下文本:
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()来去掉它们。

3个回答

10

使用以下方法并结合指定的正则表达式模式(基于负向先行断言):

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(?![^(]*?\))吗? - codecitrus
肯定看起来第一组什么也没做:https://regex101.com/r/l49ycn/4 - matsad

0

不是单个正则表达式,但可以完成任务。它会删除括号并按空格拆分文本。

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

1
但是他不想去掉括号。 - user663031
问题的结尾有一句话是“如果正则表达式能够去除括号,那就额外加分。”所以我认为这对他来说是一个可选功能。 - David Katona
1
你说得对。但是你的正则表达式不会在括号内部的空格上分割吗?顺便说一下,字符集内部的转义是不必要的。 - user663031

0

在某些情况下有用的一种方法是将括号内的空格替换为占位符,然后分割,最后再还原:

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);
                 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接