2011-09-07 10 views
9

que tienen esta cadena:cómo dividir una cadena en js con algunas excepciones

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

Necesito una función JavaScript que dividir la cadena por cada , pero sólo aquellos que no lo hacen tienen una \ antes de ellos

¿Cómo se puede hacer esto?

+0

pregunta duplicados? http: // stackoverflow.com/questions/820172/how-to-split-a-comma-separated-string-while-ignoring-escaped-commas –

+1

@Eran esa pregunta es sobre Java. Desafortunadamente, Javascript no conoce el aspecto subyacente, por lo que la solución no funciona aquí. – stema

+0

posible duplicado de [Javascript regex - string dividido] (http://stackoverflow.com/questions/4853118/javascript-regex-split-string) – outis

Respuesta

11

Aquí es lo más corta que podía llegar a:

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

La idea detrás es encontrar todos los lugares donde coma no tiene el prefijo una barra diagonal inversa, reemplace aquellos con una secuencia que no es común que aparezca en sus cadenas y luego divida por esa cadena poco común.

Tenga en cuenta que las barras invertidas antes comas tienen que ser escapados usando otra barra invertida. De lo contrario, javascript trata el formulario \, como coma escapada y produce simplemente una coma. En otras palabras, si no escapará de la barra diagonal inversa, javis ve esto: a\,bcde,fgh,ijk\,lmno,pqrst\,uv como este a,bcde,fgh,ijk,lmno,pqrst,uv.

+0

Gracias, ¿por qué estás usando un '~'? – Ovi

+0

Puede usar cualquier cosa en lugar de '~'. Tiene que ser algo (incluso algo más largo que '~') que está seguro no saldrá en una cadena que se está dividiendo, porque en el siguiente paso (después de reemplazar) estamos dividiendo la cadena usando ese carácter (s) – WTK

+0

Recomiendo usar cualquier carácter no imprimible en lugar de ~. P.ej. puede ser \ u00BB que corresponde al código del espacio de ancho cero. – Eskat0n

-1

Puede usar regex para hacer la división.

Aquí está el enlace a regex en javascript http://www.w3schools.com/jsref/jsref_obj_regexp.asp

Aquí está el enlace a otro post donde el autor ha utilizado expresiones regulares para la fractura Javascript won't split using regex

Desde el primer enlace si usted nota que usted puede crear una expresión regular utilizando

? n Coincide con cualquier cadena que no vaya seguida de una cadena específica n

[,]!\\ 
+2

Por supuesto, puede usar una expresión regular para dividir la cadena. La pregunta es CÓMO dividir la cadena de una manera que el autor solicitó. – WTK

+0

Sí, esto no es lo que quiere el autor. Estoy pensando en repetir cada división con comas, y verificar si la parte anterior tiene o no un "/" al final ... Si lo tiene, concat ambos – GoRoS

+0

@WTK El primer enlace cubría la respuesta, simplemente no quería la alimentación con cuchara. ¿Ha editado la respuesta nuevamente para incluir más información basada en sus sugerencias a través del –

3

Como las expresiones regulares en JavaScript no son compatibles con lookbehinds, no voy a cocinar un truco gigante para imitar este comportamiento. En su lugar, puede simplemente split() en todas las comas (,) y luego pegar las piezas que no deberían haberse dividido en primer lugar.

Quick 'n' sucio 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

Creo que esta solución parece una gran solución mientras hay una solución presentada por WTK – Eskat0n

+0

@ Eskat0n De hecho, * es * una solución ... una solución alternativa que abarca más líneas que otras respuestas :) – jensgram

+0

Esta solución falla si tener múltiples escapes ',' antes de un no escapado ','. P.EJ. '" ab \\, c \\, ed, fg "'. 'for (var i = 0, j = str.length - 1; i DLKJ

1

Otro feo corte en torno a la falta de look-traseros:

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>'); 

Demostración: http://jsfiddle.net/ambiguous/QbBfw/1/

no creo que lo haría en la vida real, pero funciona incluso si hacen Me siento sucio. Considera esto una curiosidad en lugar de algo que realmente deberías usar.

+0

Nice one :) (relleno) – jensgram

+0

jsFiddle más corto, usando la expresión regular de @WTK: http://jsfiddle.net/brilong87/QbBfw/2/ – blong

0

En caso si necesita quitar las barras invertidas también:

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