2016-07-25 17 views
3

Ich habe eine Zeichenfolge, und ich möchte es in Array mit dem '|' Charakter, aber nicht '\ |':Verwendung der Erfassungsgruppe in .split() - Funktion

var a = 'abc\&|\|cba'; 
var b = a.split(/([^\\])\|/); 

Ergebnis:

b = ["abc", "&", "|cba"] 

erwartete Ausgabe:

b = ["abc\&", "\|cba"] 

Grundsätzlich kann ich nicht richtig Gruppen in .split() Funktion zu erfassen.

+3

Nur um zu klären: Sie haben ' var a = 'abc \\ & | \\ | cba'; '(=' abc \ & | \ | cba') oder wirklich 'var a = 'abc \ & | \ | cba';' (= 'abc & | | cba')? Außerdem brauchen Sie hier keine Capturing Group, Sie benötigen einen Lookbehind, aber da es in JS regex flavour fehlt, müssen Sie die benötigten Strings * anpassen *. –

+0

Versuchen Sie ['b = a.match (/ (?: [^ \\ |] | \\.) +/G)'] (https://jsfiddle.net/r97opth9/) –

+0

Wenn Sie die trennen müssen extrahierte Wörter mit "|" Brauchen Sie absichtlich nur die geteilten Wörter, die mit Alphabeten beginnen, wie '[" abc \ & "," cba "]'? oder sonst wird Ihr Array wie folgt aufgeteilt nach Ihrer String-Variablen a -> '[" abc \ & "," \ "," cba "]' –

Antwort

1

Sie könnten ein positives Lookahead zum Teilen verwenden.

Mit entkam Backslash

var a = 'abc\\&|\\|cba'; 
 
var b = a.split(/\|(?=\\)/); 
 
console.log(b);

Ohne entkam Backslash

/\|(?=\|)/

  • \| entspricht das Zeichen | buchstäblich

  • (?=\|)Positive Lookahead - Behaupten, dass der Regex kann unter

    • \| entspricht das Zeichen | buchstäblich

Im Grunde ist es für aussieht angepasst werden ein Rohr und spaltet, wenn ein anderes Rohr folgt.

var a = 'abc\&|\|cba'; 
 
var b = a.split(/\|(?=\|)/); 
 
console.log(b);

+1

Ich denke nicht, dass es das ist, was OP braucht (Aufspalten mit dem nicht-entwichenen Rohr) –

+0

Das ist genau das, was ich wollte. Kannst du bitte deine zweite Lösung erklären? @Nina Scholz –

0

Sie können es tun, wie mit Regex Ausdrücke folgt, jedes identifizierte Wort zu speichern (in diesem Fall der Preis) in einem Array und dann greifen, wenn nötig

var re = /(?:^|[ ])|([a-zA-Z]+)/gm; 
var str = 'abc\&|\|cba'; 
var identifiedWords; 

while ((identifiedWords = re.exec(str)) != null) 
{ 
    if (identifiedWords.index === re.lastIndex) 
    { 
     re.lastIndex++; 
    } 
// View your result using the "identifiedWords" variable. 
// eg identifiedWords[0] = abc\& 
// identifiedWords[1] = cba 

}

0

Ich nehme an, Sie haben ein Literal \ in Ihren Strings, und dass Ihre Frage einen Tippfehler in t enthält er gab String-Literal ein. In JS C-Strings müssen Sie einen doppelten \ verwenden, um einen Literal-Backslash zu definieren (da in regulären String-Literalen Escape-Sequenzen wie \r, \n usw. definiert werden können).

Ihr Regex muss mit allen Zeichen außer \ und | oder einem beliebigen Literal \ übereinstimmen, gefolgt von einem beliebigen Buchstaben.Wenn die Zeichenfolge eine wörtliche \ gleich können, müssen Sie

var a = 'abc\\&|\\|cba'; 
 
b = a.match(/(?:[^\\|]|\\.?)+/g); 
 
console.log(b);

Das Muster passt:

  • (?: - (Beginn einer Nicht-Erfassung Wechsel Gruppe)
    • [^\\|] - beliebige andere Zeichen als \ und |
    • | - oder
    • \\.? - ein \ mit irgendwelchen 1 oder 0 Zeichen gefolgt, aber eine neue Zeile
  • )+ - 1 oder mehrmals
+0

Aber ich habe tatsächlich Single entkommen und nicht doppelt entkommen. Ich fürchte, kann es nicht getan werden? :( –

+0

Nein, das ist nicht möglich, weil Sie sie entweder als wörtliche Symbole haben, oder Sie haben keine. –