2012-09-05 4 views
5

Ich habe eine Zeichenfolge aus der Datei gelesen, die ich auf | geteilt habe Charakter. Zum Beispiel ist der StringJavascript - regulärer Ausdruck zum Aufteilen von Strings auf unescaped Zeichen, z. | aber ignoriere |

1|test pattern|prefix|url|postfix 

So muss Split geben mir immer 5 Substrings, die im obigen Fall sind

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

Das Problem kommt, wenn jeder dieser fünf Teil enthält | Charakter. Ich würde es als maskiert speichern

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

Jetzt können Sie sehen, dass string.split ('|') mir nicht das gewünschte Ergebnis geben wird. Das gewünschte Ergebnis ist

Ich habe einige reguläre Ausdrücke versucht, aber keine von ihnen gibt das gewünschte Ergebnis.

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

Es sieht wie folgt aus ist nur möglich mit negativen lookbacks aber ich konnte man nicht

+0

Ich nehme an, Sie haben keine Kontrolle über den Charakter zu sein innerhalb der Zeichenfolge verwendet, um die Elemente zu trennen? – Patrick

+0

Ihr String ergibt: >> var word = '1 | Testmuster | Präfix | url \ | Titel | Postfix '; >> Wort "1 | Testmuster | Präfix | URL | Titel | Postfix" Meinst du es als '1 | Testmuster | Präfix | url \\ | Titel | Postfix 'stattdessen? –

+0

@Patrick: Ich kann das Delimeter nicht ändern, weil es jetzt in vielen Dateien verwendet wurde, aber ich kann das Escape-Zeichen ändern \ – Kashif

Antwort

6

Eine andere Lösung:

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

Das heißt, Sie werden Ihre Backslash in der Anfangs String mit einem anderen Backslash müssen, damit es funktioniert:

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

Arbeits Demo verfügbar here.

+0

+1 das ist wirklich nett. – Christoph

+0

Dies funktioniert für die in der Frage erwähnte Zeichenfolge, schlägt aber fehl für 1 | Testmuster | Präfix | url \\ | \\ | title | postfix – Kashif

+0

@Kashif [Offensichtlich] (http://jsfiddle.net/s5stR/1/), es funktioniert ... – sp00m

3

Leider unterstützt Javascript nicht Lookbehinds an die Arbeit. Ich sehe keine einfache Lösung, aber die folgende könnte als Abhilfe geeignet sein:

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

dies unter Umständen scheitern könnte jedoch, wenn es Leerzeichen beteiligt: ​​

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

Alternativ Sie so etwas wie dies nutzen könnten.

+0

eine einfache 'Grenze' würde es tun..keine Notwendigkeit für' ersetzen' – Anirudha

+0

@Anirudha Ich fügte es hinzu als eine Option, aber es wird mit Leerzeichen fehlschlagen. – Christoph

+0

Sie haben vergessen hinzuzufügen \ b – Anirudha

1

Statt split() verwenden könnten Sie alle Vorkommen übereinstimmen, die Sie interessiert sind:

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

es Siehe in Aktion in der Fiddle

+0

+1 für nette Idee, das Problem zu behandeln Die Lösung funktioniert nicht vollständig obwohl, es gibt einige unerwartete leere Elemente – Kashif

+0

@Kashif, yeah, verpasste ich die '[0]' auf dem Artikel, siehe http : //jsfiddle.net/3uJYm/ damit es gut funktioniert – Lucero

Verwandte Themen