2011-09-07 102 views
9

我有這個字符串:如何在JS有一些例外分割字符串

a\,bcde,fgh,ijk\,lmno,pqrst\,uv 

我需要一個JavaScript函數,將通過每,但只有那些\分割字符串在他們面前

這怎麼辦?

+0

重複的問題? http:// stackoverflow。com/questions/820172/how-to-split-a-comma-separated-string-while-ignore-escaped-commas –

+1

@Eran這個問題是關於Java的。不幸的是,Javascript不知道向後看,所以解決方案在這裏不起作用。 – stema

+0

[Javascript正則表達式 - 拆分字符串]的可能重複(http://stackoverflow.com/questions/4853118/javascript-regex-split-string) – outis

回答

11

這是我能想出最短的事情:

'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.replace(/([^\\]),/g, '$1\u000B').split('\u000B') 

背後的想法是要找到每一個地方逗號不帶前綴的地方一個反斜槓,用那些不常見的字符串取代你的字符串,然後用那個不常見的字符串分割。

請注意,反斜槓之前逗號必須使用另一個反斜槓轉義。否則,javascript會將\,作爲轉義逗號對待,並只產生一個逗號!換句話說,如果你不能逃避反斜槓,JavaScript看到這個:a\,bcde,fgh,ijk\,lmno,pqrst\,uv這個a,bcde,fgh,ijk,lmno,pqrst,uv

+0

謝謝,你爲什麼用'〜'? – Ovi

+0

你可以使用任何東西來代替'〜'。它必須是某種東西(甚至比'〜'長的東西),你肯定不會出現在被分割的字符串中,因爲在下一步(替換之後),我們使用該字符分割字符串(S)。 – WTK

+0

我建議使用任何不可打印的字符而不是〜。例如。它可以對應於零寬度空間的代碼。 – Eskat0n

-1

您可以使用正則表達式來進行拆分。

這裏是鏈接在JavaScript http://www.w3schools.com/jsref/jsref_obj_regexp.asp

這裏正則表達式是鏈接到其他帖子裏筆者已經使用正則表達式拆分Javascript won't split using regex

從第一個鏈接,如果你注意,您可以創建一個正則表達式使用

?!n匹配後面沒有指定字符串任何字符串n

[,]!\\ 
+2

當然,您可以使用正則表達式來拆分字符串。問題是如何以作者要求的方式拆分字符串。 – WTK

+0

是的,這不是作者想要的。我正在考慮循環使用。每個分割都用逗號進行循環,並檢查前面每個部分最後是否有「/」。如果有,則連接 – GoRoS

+0

@WTK第一個鏈接覆蓋了答案,只是不想餵食。根據你的建議,雖然 –

3

由於JavaScript中的正則表達式不支持lookbehinds,因此我不打算用一個巨大的黑客來模仿這種行爲。相反,您可以在所有逗號(,)上使用split(),然後粘貼不應該首先拆分的部分。

快速「N」髒demo

var str = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','), // Split on all commas 
    out = []; // Output 

for (var i = 0, j = str.length - 1; i < j; i++) { // Iterate all but last (last can never be glued to non-existing next) 
    var curr = str[i]; // This piece 
    if (curr.charAt(curr.length - 1) == '\\') { // If ends with \ ... 
     curr += ',' + str[++i]; // ... glue with next and skip next (increment i) 
    } 
    out.push(curr); // Add to output 
} 
+0

我認爲這個解決方案看起來像一個非常大的解決方法,而WTK提供的解決方案是 – Eskat0n

+0

@ Eskat0n確實它*是一種解決方法......一種解決方法,發生在比其他答案更多的線上:) – jensgram

+0

如果您的解決方案失敗有多次逃脫「,」在未逃脫之前「,」。例如。 ' 「AB \\,C \\編,FG」'。 (var i = 0,j = str.length-1; i(i = 0,j = str.length-1; i DLKJ

1

另一個醜陋的黑客身邊缺少查找的屁股:

function rev(s) { 
    return s.split('').reverse().join(''); 
} 

var s = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'; 

// Enter bizarro world... 
var r = rev(s); 

// Split with a look-ahead 
var rparts = r.split(/,(?!\\)/); 

// And put it back together with double reversing. 
var sparts = [ ]; 
while(rparts.length) 
    sparts.push(rev(rparts.pop())); 

for(var i = 0; i < sparts.length; ++i) 
    $('#out').append('<pre>' + sparts[i] + '</pre>'); 

演示:http://jsfiddle.net/ambiguous/QbBfw/1/

我不認爲我會在現實生活中做到這一點,但即使它確實使它的工作原理我感到骯髒。考慮這個好奇心,而不是你應該真正使用的東西。

+0

不錯的一個:)(填充) – jensgram

+0

更短的jsFiddle,使用@WTK的正則表達式:http://jsfiddle.net/brilong87/QbBfw/2/ – blong

0

在情況下,如果需要刪除反斜槓也:

var test='a\\.b.c'; 
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B'); 
//result: ["a.b", "c"]