2012-02-02 96 views
1

如何將一個JavaScript字符串(如foo\nbar\baz)分割爲一行數組,同時保留換行符?我想獲得['foo\n', 'bar\n', 'baz']作爲輸出;用javascript分隔字符串中的字符串,保留換行符?

我知道有很多可能的答案 - 我只是想找到一個時尚的答案。

用Perl我會用zero-width lookbehind assertionsplit /(?<=\n)/,但它們不支持在JavaScript的正則表達式。

PS。用於處理不同行結尾(至少\r\n)和處理缺少的最後一個換行符的額外點(如我的示例中所示)。

+0

@Diodeus:有效的論據。馬上解決這個問題。 – tuomassalo 2012-02-02 19:31:05

+0

那裏。再次感謝您提醒臨時用戶。 – tuomassalo 2012-02-02 19:36:47

回答

5

您可以對這個模式的全局匹配:/[^\n]+(?:\r?\n|$)/g

它匹配任何非換行符接着匹配一個可選的\r其次\n,或字符串的結尾。

var input = "foo\r\n\nbar\nbaz"; 
var result = input.match(/[^\n]+(?:\r?\n|$)/g); 

結果:["foo\r\n", "bar\n", "baz"]

+0

缺陷:''\ n'.match(/ [^ \ n] +(?:\ r?\ n | $)/ g)'returns' null' – 2015-07-18 13:27:59

+0

也是'\ r \ r \ r'。匹配(/ [^ \ n] +(?:\ r?\ n | $)/ g)'returns ['\ r \ r \ r'] – 2015-07-18 13:29:13

+0

我認爲這個正則表達式應該是:'/([^ \ r \ n] *(?:嗎?\ r \ n)的| [^ \ r \ n]的+)/ g' – 2015-07-18 13:34:06

0

一個簡單但粗糙的方法將首先用2個特殊字符替換「\ n」。拆分第二個,用分割後的「\ n」替換第一個。效率不高,不優雅,但絕對有效。

2

這個怎麼樣?

"foo\nbar\nbaz".split(/^/m); 

結果

["foo 
", "bar 
", "baz"] 
+0

IE中的結果無效。太多的換行符。 – Hemlock 2012-02-02 20:10:12

0

我會遠離split遠用正則表達式,因爲IE瀏覽器有一個失敗的實現它。改爲使用match

'foo\n\bar\n\baz".match(/^.*(\r?\n|$)/mg)

結果:["foo\n", "bar\n", "baz"]