2013-01-24 28 views
2
'a|b||c|d'.split(re) 

想要的結果如何根據孤立角色進行分割?

[ 'a', 'b||c', 'd' ] 

也就是說,bc保持,因爲一起有豎條,沒有之一。

我想:

/(?:[^|])\|(?:[^|])/ 

也就是說,「匹配,但在此之前和分隔符後不捕獲,非豎線」。不,根本不起作用。

(這是在Javascript,但我覺得很多RE庫的工作會以同樣的方式。)

+0

雖然'(?:)'導致它不會將這些匹配放入捕獲組中,它會消耗匹配項,使它給您看到的結果。解決這個問題的最明顯的方法是使用零寬度斷言(lookaround),但JS不支持倒序。 – NullUserException

+2

解決這個問題的一個簡單方法是執行搜索並替換所有'||'的實例,用某種佔位符替換它們,然後在'|'上分割並在之後恢復'||'。 – NullUserException

+0

@NullUserException - 「最明顯的方式」...一個新的使用「明顯」的單詞。 – Malvolio

回答

4

您需要lookaround/(?<!\|)\|(?!=\|)/),但回顧後是不是在JavaScript支持。相反,分裂的字符串,嘗試匹配:

'a|b||c|d'.match(/([^|]|\|{2,})+/g) 
0

在你的情況下,由於豎線|是不是可以用一個字字符:

'a|b||c|d'.split(/\b\|(?!\|)/) 

避開JS」缺乏lookbehinds的。

這將拆分第一個|確保它不是後跟|

但是,如果您的分隔項目以符號結尾,它將會失敗 「a。| b || c | d」 - 「a」。將不會被拆分。

我認爲你最好的選擇是遵循@NullUserException的建議並替換'||'與一個佔位符,拆分,並替換回來, @ Bergi的解決方案,而不是分裂。