2012-05-16 526 views
5

我有一個像下面的Javascript:用逗號分割的字符串,但忽略引號逗號

var str="A,B,C,E,'F,G,bb',H,'I9,I8',J,K" 

我想拆就逗號的字符串的字符串。但是,如果單引號內有東西,我需要它忽略逗號,如下所示。

A 
B 
C 
E 
F,G,bb 
H 
I9,I8 
J 
K 
+1

的可能重複的[Javascript代碼解析CSV數據](http://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data ) – stema

回答

12
> str.match(/('[^']+'|[^,]+)/g) 
["A", "B", "C", "E", "'F,G,bb'", "H", "'I9,I8'", "J", "K"] 

雖然你要求這個,你可能不佔角情況下,例如:

  • 'bob\'s'就是'被轉義的字符串
  • a,',c
  • a,,b
  • a,b,
  • ,a,b
  • a,b,'
  • ',a,b
  • ',a,b,c,'

上述一些由這個正確處理的;其他人不是。我強烈建議人們使用一個經過深思熟慮的庫,以避免現在或未來(如果您擴展您的代碼或其他人使用它)避免諸如安全漏洞或微妙錯誤等事情。


說明正則表達式的:

  • ('[^']+'|[^,]+) - 意味着比賽要麼'[^']+'[^,]+
  • '[^']+'意味着報價......一個或更多的非報價...報價
  • [^,]+意味着一個或更多的非逗號

注:通過消耗加引號的字符串之前引用的字符串,我們作出的加引號的字符串的情況下更容易的解析。

+1

** + 1 **請你解釋它是如何工作的? – gdoron

+0

謝謝,它適合我。您提到的情況不會影響我 –

+0

@gdoron:'('[^'] +'| [^,] +)' - 表示「匹配''[^'] +''或'[^,] +' 」。 ''[^'] +''表示「引用......一個或多個非引號......引用」。 '[^,] +'表示「一個或多個非逗號」。 – ninjagecko

6

這是我的版本可以使用單引號和雙引號,並且可以嵌入多個帶逗號的引號字符串。它給出了空的結果,並且它們太多了,所以你必須檢查它。沒有經過嚴格的測試。請原諒過度使用'\'。

var sample='this=that, \ 
sometext with quoted ",", \ 
for example, \ 
another \'with some, quoted text, and more\',\ 
last,\ 
but "" "," "asdf,asdf" not "fff\',\' fff" the least'; 

var it=sample.match(/([^\"\',]*((\'[^\']*\')*||(\"[^\"]*\")*))+/gm); 
for (var x=0;x<it.length;x++) { 
var txt=$.trim(it[x]); 
if(txt.length) 
    console.log(">"+txt+'<'); 
}​ 
0

使用此

  var input="A,B,C,E,'F,G,bb',H,'I9,I8',J,K"; 
      //Below pattern will not consider comma(,) between ''. So 'I9,I8' will be considered as single string and not spitted by comma(,). 
      var pattern = ",(?=([^\']*\'[^\']*\')*[^\']*$)"; 
      //you will get acctual output in array 
      var output[] = input.split(pattern); 
+0

儘管這段代碼可能會解決這個問題,包括一個解釋[真的有幫助](// meta.stackexchange.com/q/114762)來提高您的帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

相關問題