2016-12-10 49 views
2

我試圖拆分文本下面像空間:分割字符串的所有空間,除了那些在括號

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()會在後續步驟中擺脫它們。

回答

6

使用與特定的正則表達式模式以下的方法(基於負前向斷言):

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後面沒有括號)(包括伴隨的字符)
0

沒有一個正則表達式,但做這項工作。刪除括號並用空格分隔文本。

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

但他並不想刪除括號。 –

+0

在問題結尾處有「如果正則表達式刪除括號,則爲獎勵點數」。所以我認爲這是他的一個可選功能。 –

+0

你說得對。但是,你的正則表達式不會在括號內的空格上分裂嗎?順便說一下,字符集內的那些逃脫並不是必需的。 –

0

一種方法在某些情況下是有用的是一個佔位符,然後拆分來代替括號內的空間,然後unreplace:

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

相關問題