2012-09-05 9 views
5

He leído una cadena del archivo que he dividido | personaje. Por ejemplo, la cadena esJavascript: expresión regular para dividir cadena en caracteres no escaneados, p. | pero ignora |

1|test pattern|prefix|url|postfix 

Así dividida siempre me tiene que dar 5 subseries, que en el caso anterior son

["1", "test pattern", "prefix", "url", "postfix"] 

El problema viene cuando cualquiera de estos cinco subseries contiene | personaje. Lo almacenaría como escapado \ |

1|test pattern|prefix|url \| title |postfix 

Ahora, puede ver que string.split ('|') no me dará el resultado deseado. El resultado deseado es

["1", "test pattern", "prefix", "url \| title ", "postfix"] 

He intentado algunas expresiones regulares pero ninguna de ellas da el resultado deseado.

string.split(/[^\\]\|/) //["", "", "prefi", "$url \| $titl", " postfix"] 

Parece que esto sólo es posible con lookbacks negativos, pero no pude conseguir una para trabajar

+0

Debo entender que no tiene control sobre el carácter que es utilizado dentro de la cadena para separar los elementos? – Patrick

+0

Su cadena rinde: >> var word = '1 | test pattern | prefix | url \ | título | postfix '; >> palabra "1 | patrón de prueba | prefijo | url | título | postfijo" ¿Quisiste decir que es como '1 | test pattern | prefix | url \\ | título | postfix 'en su lugar? –

+0

@Patrick: No puedo cambiar el delímetro, porque ahora se ha utilizado en muchos archivos, pero puedo cambiar el carácter de escape \ – Kashif

Respuesta

6

Otra solución:

"1|test pattern|prefix|url \\| title |postfix" 
.replace(/([^\\])\|/g, "$1$1|") 
.split(/[^\\]\|/); 

Dicho esto, tendrá que escapar de su barra invertida en la cadena inicial con otra barra invertida para que funcione:

"1|test pattern|prefix|url \\| title |postfix" 
         ^

demostración de trabajo disponible here.

+0

+1 esto realmente es bueno. – Christoph

+0

Esto funciona para la cadena mencionada en la pregunta pero falla para 1 | patrón de prueba | prefijo | url \\ | \\ | título | postfix – Kashif

+0

@Kashif [Obviamente] (http://jsfiddle.net/s5stR/1/), funciona ... – sp00m

3

Desafortunadamente Javascript no soporta lookbehinds. No veo ninguna solución fácil, pero lo siguiente podría ser adecuado como solución:

// use two backslashes in your string! 
var string = '1|test pattern|prefix|url \\| title |postfix'; 

// create an arbitrary unique substitute character 
var sub = "-"; 

string.replace(/\\\|/g,sub).split(/\|/); 

/* replace the substituted character again in your array of strings */ 

otra posibilidad es utilizar algo como esto:

string.split(//\|\b//) 

Sin embargo, esto puede fallar en algunas circunstancias cuando hay espacios en blanco en cuestión.

+0

un simple 'límite 'lo haría .. no es necesario' reemplazar' – Anirudha

+0

@Anirudha Lo agregué como una opción pero fallará con espacios en blanco. – Christoph

+0

se le olvidó agregar \ b – Anirudha

1

En lugar de utilizar split() que podría coincidir con todas las ocurrencias que le interesan:

var rx = /([^\\\|]|\\\|?)+/gi, item, items = []; 
while (item = rx.exec(str)) { 
    items.push(item[0]); 
} 

verlo en acción en el Fiddle

+0

+1 para una buena idea para manejar el problema La solución no funciona del todo, hay algunos elementos vacíos inesperados – Kashif

+0

@Kashif, sí, olvidé '(0)' en el artículo, vea http : //jsfiddle.net/3uJYm/ para que funcione bien – Lucero

Cuestiones relacionadas