2012-05-16 18 views
5

que tiene una cadena como siguienteJavascript: Separar una cadena por una coma, pero haciendo caso omiso de las comas en las citas

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

me gustaría dividir la cadena de comas. Sin embargo, en el caso de que algo esté dentro de comillas simples, lo necesito para ignorar las comas como sigue.

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

posible duplicado de [código Javascript para analizar datos CSV] (http://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data) – stema

Respuesta

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

A pesar de que leas esto, es posible que no tenidos para angulares casos donde, por ejemplo:

  • 'bob\'s' es una cadena en la que se escaparon '
  • a,',c
  • a,,b
  • a,b,
  • ,a,b
  • a,b,'
  • ',a,b
  • ',a,b,c,'

algunos de los anteriores se manejan correctamente por este; otros no lo son Recomiendo encarecidamente que las personas utilicen una biblioteca que haya pensado en esto, para evitar cosas como vulnerabilidades de seguridad o errores sutiles, ahora o en el futuro (si expandes tu código o si otras personas lo usan).


Explicación de la expresión regular:

  • ('[^']+'|[^,]+) - significa partido ya sea'[^']+'o[^,]+
  • '[^']+' significa cita ... uno-o-no-más cotizaciones ... citar.
  • [^,]+ significa una sola o más no comas

Nota: por el consumo de la cadena entre comillas antes de la cadena sin comillas, hacemos el análisis de la cadena sin comillas caso más sencillo.

+1

** + 1 ** ¿Puedes explicarme cómo funciona? – gdoron

+0

Gracias, funciona para mí.Los casos que mencionas no me afectan –

+0

@gdoron: '('[^'] + '| [^,] +)' - significa "hacer coincidir cualquiera'' [^ '] +' 'o' [^,] + ' ". ''[^'] + '' significa" cita ... una o más citas sin comillas ... ". '[^,] +' significa "uno o más comas". – ninjagecko

6

Aquí está mi versión que funciona con comillas simples y dobles y puede tener varias cadenas entrecomilladas con comas incrustadas. Da resultados vacíos y demasiados, por lo que debes verificarlo. No rigurosamente probado. Disculpe el uso excesivo de '\'.

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

Utilice esta

  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

Si bien este fragmento de código puede resolver la pregunta, incluyendo una explicación [realmente ayuda] (// meta.stackexchange.com/q/114762) para mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, ¡no solo a la persona que pregunta ahora! Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas