2012-09-05 13 views
5

Ho letto una stringa dal file su cui sono stato diviso | carattere. Ad esempio, la stringa èJavascript: espressione regolare per dividere la stringa su caratteri senza caratteri, ad es. | ma ignora |

1|test pattern|prefix|url|postfix 

Così divisa deve sempre darmi 5 sottostringhe, che nel caso di cui sopra sono

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

Il problema arriva quando uno di questi cinque stringhe contiene | carattere. Lo memorizzerei come escape \ |

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

Ora, è possibile vedere che string.split ('|') non mi darà il risultato desiderato. Il risultato desiderato è

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

Ho provato alcune espressioni regolari ma nessuna di queste dà il risultato desiderato.

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

Sembra che questo è possibile solo con finestre di ricerca negative, ma non ho potuto ottenere uno a lavorare

+0

Immagino che lei non ha il controllo sul personaggio di essere usato all'interno della stringa per separare gli elementi? – Patrick

+0

La stringa restituisce: >> var word = '1 | modello di prova | prefisso | url \ | title | postfix '; >> word "1 | modello di prova | prefisso | url | titolo | postfix" Intendevi averlo come '1 | modello di prova | prefisso | url \\ | titolo | postfix 'invece? –

+0

@Patrick: non riesco a cambiare il delimitatore, perché ora è stato usato in molti file ma posso cambiare il carattere di escape \ – Kashif

risposta

6

Un'altra soluzione:

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

Detto questo, avrete bisogno di sfuggire al tuo backslash nella stringa iniziale con un altro backslash per farlo funzionare:

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

demo funzionante disponibili here.

+0

+1 questo è davvero bello. – Christoph

+0

Funziona per la stringa menzionata nella domanda ma non riesce per 1 | modello di prova | prefisso | url \\ | \\ | title | postfix – Kashif

+0

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

3

Purtroppo JavaScript non supporta lookbehinds. Non vedo alcuna soluzione facile, ma il seguente potrebbe essere adatto come soluzione alternativa:

// 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 */ 

In alternativa si potrebbe usare qualcosa di simile:

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

Tuttavia questo potrebbe non riuscire in alcune circostanze quando ci sono spazi bianchi coinvolti.

+0

un semplice 'limite 'lo farebbe..non c'è bisogno di' replace' – Anirudha

+0

@Anirudha L'ho aggiunto come opzione ma fallirà con gli spazi bianchi. – Christoph

+0

Hai dimenticato di aggiungere \ b – Anirudha

1

Invece di utilizzare split() si potrebbe corrispondere a tutte le occorrenze che vi interessano:

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

vederlo in azione nel Fiddle

+0

+1 per una buona idea per gestire il problema La soluzione non funziona completamente però, ci sono alcuni elementi vuoti inaspettati – Kashif

+0

@Kashif, sì, ho perso il '[0]' sull'elemento, vedi http : //jsfiddle.net/3uJYm/ perché funziona correttamente – Lucero

Problemi correlati