2012-05-16 15 views
5

Ben virgül üzerinde dize bölmek istiyorumJavaScript: virgülle bir dize Yarma ama tırnak içinde virgül görmezden

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

aşağıdaki gibi bir dize var. Bununla birlikte, bir şeyin tek tırnak işaretleri içinde olması durumunda, her ikisinin de aşağıdaki gibi virgülleri görmezden gelmesi gerekir. Eğer bu talep rağmen örneğin nerede

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

olası yinelenen http://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data) – stema

cevap

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

, sen köşe durumlarda sorumluydu olmayabilir:

  • 'bob\'s'' kaçan bir dizedir
  • a,',c
  • a,,b
  • a,b,
  • ,a,b
  • a,b,'
  • ',a,b
  • ',a,b,c,'

bu tarafından ele doğru yukarıda bazıları; diğerleri değildir. İnsanların, şu anda veya gelecekte (güvenlik kodunuzu genişletirseniz veya başkaları tarafından kullanılıyorsa) güvenlik açıkları veya ince hatalar gibi şeylerden kaçınmak için bunu düşünen bir kütüphane kullanmasını şiddetle tavsiye ederim. RegEx'in


Açıklama:

  • ('[^']+'|[^,]+) - eşleşmeyi'[^']+'veya [^,]+
  • '[^']+'alıntı ... bir olarak veya-daha-olmayan tırnak anlamına gelir ... alıntı.
  • [^,]+

tek veya-daha-olmayan virgül Not anlamı: tırnaksız dize önce alıntı dize tüketerek, biz tırnaksız dize halinde daha kolay ayrıştırılmasını olun.

+1

** + 1 ** Lütfen nasıl çalıştığını açıklayabilir misiniz? – gdoron

+0

Teşekkür ederim, benim için çalışıyor.Bahsettiğim durumlar beni etkilemiyor –

+0

@gdoron: '('[^'] + '| [^,] +)' - "ya" [^'] + ''veya' [^,] + 'anlamına gelir ". ''[^'] + '', "alıntı ... bir ya da daha fazla olmayan fiyat teklifi ..." anlamına gelir. [^,] + '," bir veya daha fazla olmayan virgül "anlamına gelir. – ninjagecko

6

Tek ve çift tırnak işaretleri ile çalışan ve virgülle gömülü birden fazla alıntı dizisine sahip olan benim sürümüm. Boş sonuçlar verir ve çok fazla, bu yüzden bunu kontrol etmelisiniz. Titizlikle test edilmedi. Lütfen '\' aşırı kullanımı için özür dileriz.

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

kullanımı ([CSV verilerini ayrıştırmak için Javascript kodu] Bu

  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

Bu kod snippet'i, bir gönderiyi içeren [gerçekten yardımcı] (// meta.stackexchange.com/q/114762) sorunuzu da dahil ederek sorunu çözebilir. Gelecekte okuyucular için soruyu cevapladığınızı unutmayın, sadece şimdi soran kişi için değil! Lütfen cevabınızı açıklama eklemek için düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge verin. –

İlgili konular