2012-09-01 148 views
0

我不是一個正則表達式高手,但是我正在尋找一個正則表達式,這將使這個結果JS:正則表達式逗號分隔字符串

var regex = ...; 
var result = '"a b", "c, d", e f, g, "h"'.match(regex); 

和結果將是

['"a b"', '"c, d"', 'e f', 'g', '"h"'] 

編輯:

轉義報價不需要處理。它是一個標籤領域,即用戶必須能夠進入:

標籤1,標籤2

而且

「美國紐約」, 「波士頓,美國」

EDIT2: 感謝您的驚人快速答案minitech,這就是訣竅!

+2

對此有什麼規定?除非在雙引號之間,否則用逗號分割? –

+0

這基本上是的 – Jelle

回答

3

我只是用一個循環:

function splitCSVFields(row) { 
    var result = []; 
    var i, c, q = false; 
    var current = ''; 

    for(i = 0; c = row.charAt(i); i++) { 
     if(c === '"') { 
      current += c; 
      q = !q; 
     } else if(c === ',' && !q) { 
      result.push(current.trim()); 
      current = ''; 
     } else { 
      current += c; 
     } 
    } 

    if(row.length > 0) { 
     result.push(current.trim()); 
    } 

    return result; 
} 

注:需要String#trim,你可以希夫如下:

if(!String.prototype.trim) { 
    String.prototype.trim = function() { 
     return this.replace(/^\s+/, '').replace(/\s+$/, ''); 
    }; 
} 
+0

+1。這是做這件事的好方法。 – icktoofay

+0

我認爲唯一的突破點是如果在一對引號內允許使用雙引號。仍然+1 –

+2

@ user1600680:我認爲這一點,但決定對它,現在我會決定:)只需一分鐘... – Ryan

1

正則表達式可能不是此任務的最佳工具。您可能想要改爲通過遍歷字符並決定要做什麼來代替它。下面是一些僞代碼,將做到這一點:

  • 循環通過人物:
    • 它是一個報價?
      • 切換報價標誌。
    • 當報價標誌未設置時是否爲逗號?
      • 將累加的字符串添加到數組中。
      • 清除累積的字符串。
      • 跳過本次迭代中的其餘步驟。
    • 將當前字符添加到正在積累的字符串中。
  • 累計字符串是否爲空?
    • 將累加的字符串添加到數組中。
  • (可選)從數組中的所有字符串中去除空白字符。
    這也可以在將字符串添加到數組中時完成。
+0

[minitech的回答](http://stackoverflow.com/a/12231349)是這個的具體實現。 – icktoofay

0
var result = input.match(/(?:(?:"((?:[^"]|"")*)")|([^",\n]*))/g); 
for (var i = 0; i < result.length; i++) { 
    result[i] = result[i].replace(/^\s*/, "").replace(/\s*$/, ""); 
    if (result[i].length === 0) { 
    result.splice(i--, 1); 
    } 
} 

測試此代碼here

相關問題