2017-01-10 13 views
2

ich auf Standard-Leerzeichen teilen möchten " " aber nicht Leerzeichen entkommen „\“Regex auf Leerzeichen zu trennen, aber nicht entkommen Leerzeichen

Zum Beispiel mit der Zeichenfolge 'my name\ is\ max' (einfache Anführungszeichen so \ wörtlichen ist)

ich möchte bekommen ["my", "name\ is\ max"]

ich diese Regex versucht haben: /[^\\]\s/

aber das Ergebnis ist folgendes:

=> ["m", "name\\ is\\ max"] 

Dies ist in der Nähe, aber ich weiß nicht, wie die y halten in my


bearbeiten

Als weiteres Beispiel betrachten diese Zeichenfolge:

"./db/users/WGDl-HATof-uhdtT7sPfog: [email protected] name=max\\ p" 

Ich möchte es in drei teilen:

[ 
    "./db/users/WGDl-HATof-uhdtT7sPfog:", 
    "[email protected]", 
    "name=max\\ p" 
] 
+0

Das bedeutet, ein Literal Backslash wird auch verdoppelt, oder? '' mein Name \\ is \ max'' wäre "[" mein "," Name \\\\ "," ist \\ max "]'? –

+0

@ WiktorStribiżew Ich versuche, auf Leerzeichen, die nicht durch einen Backslash vorangestellt ist, zu teilen. Also ich denke nicht, dass das korrekt ist. –

+0

Dann '.split (/ (?

Antwort

3

In Bezug auf

Ich versuche, auf Leerzeichen zu trennen, die nicht durch einen umgekehrten Schrägstrich vorangestellt wird.

Wenn Sie nur über Backslash vor Leerzeichen kümmern und es gibt keine andere Sonderfälle zu prüfen, eine negative Lookbehind (?<!\\) vor \s verwenden:

s.split(/(?<!\\)\s/) 

Hier \s+ Streichhölzer 1+ Leerzeichen, wenn nicht voran mit ein umgekehrter Schrägstrich ((?<!\\) ist ein negativer Lookbehind, der überprüft, ob der Text auf der linken Seite der aktuellen Position dem Muster entspricht, und wenn ja, ist die Übereinstimmung fehlgeschlagen).

Falls es mehrere Leerzeichen zu prüfen, und falls dort müssen mit Escape-Sequenzen umgehen, verwenden Sie

s.scan(/(?:[^\s\\]|\\.)+/) 

Siehe Ruby demo

Hier (?:[^\s\\]|\\.)+ Treffer für 1 oder mehr Zeichen andere als ein Backslash und Whitespace ([^\s\\]) oder irgendeine Escape-Sequenz(). Fügen Sie /m Modifikator hinzu, um . Match-Linie zu machen.

+0

Können Sie meine Bearbeitung zu der Frage bitte sehen? Es gibt einen zweiten Testfall, mit dem nicht gearbeitet wurde. –

+0

Siehe http://ideone.com/Ji3HsM. Tatsächlich führt das von mir vorgeschlagene Splitting auch zu dem erwarteten Ergebnis: http://ideone.com/4sY1E2 –

1

versuchen Sie dies: "./db/users/WGDl-HATof-uhdtT7sPfog: [email protected] name=max\\ p".split(/(?<![\\])[\s](?![\\])/).

Eine Aufschlüsselung der Regex (?<![\\])[\s](?![\\]):

(?<![\\]) Dies teilt das Regex-Engine ein Leerzeichen nicht mit einem Backslash „\“ (entging hier mit einem anderen Backslash)

[\s] Dies ist ein voran passen Zeichenklasse für einen ‚Raum‘

(?![\\]) Dies teilt das Regex-Engine ein Leerzeichen entsprechen, die von einem Backslash „\“ (entging hier mit einem anderen Backslash)

+0

Warum verwenden Sie ein negatives Lookahead? Sollte der negative Lookbehind nicht genug sein? –

+0

Gute Frage. Ich dachte, aus welchem ​​Grund auch immer, dass es Fälle geben könnte, wo es ein Leerzeichen geben würde, gefolgt von einem Backslash, aber jetzt, wo ich darüber nachdenke, denke ich, dass es nicht notwendig ist. –

3

Versuchen Sie, diese

require 'shellwords' 

'my name\ is\ max'.shellsplit 
# => ["my", "name is max"] 

keine Notwendigkeit für einen regulären Ausdruck.

+0

Nie davon gehört. Vielen Dank! –

Verwandte Themen