2016-12-22 5 views
3

Ich habe einen Text (die einige von Ihnen als Teil eines Vermögens Datei erkennen)Regex zu erfassen alles (incuding Zeilenumbrüche) innerhalb einer Erfassungsgruppe

A day for firm decisions!!!!! Or is it? 
% 
A few hours grace before the madness begins again. 
% 
A gift of a flower will soon be made to you. 
% 
A long-forgotten loved one will appear soon. 

Buy the negatives at any price. 
% 

Wie zu sehen ist, enthält diese sowohl einzelne Zeile Text und Blocktext (wie im letzten Glück gesehen).

Ich habe derzeit eine Regex, die alle Einstrang-Vermögen erfassen wird, jedoch erfasst es nicht das Multiline-Vermögen.

(?<=%\n)(.*?)(?=\n%)

Ich verstehe, dass es eine /m mehrzeilige Option, aber ich habe nicht die ganze Regex mehrzeilige sein wollen aktiviert ist (ich habe es nicht bekommen überhaupt auf diese Weise zu arbeiten).

Meine Frage ist also: Wie kann ich mehrzeilige Textblöcke zwischen Trennzeichen als lokale Erfassungsgruppe auswählen? Es sollte beachtet werden, dass ich dies in JavaScript verwenden werde.

+0

Was ist Ihre Wunschausgabe? –

Antwort

0

die Sie interessieren,

str.split(/\n%\n/) 

Dies teilt den String durch Linien, die % nur enthalten.

0

Um eine neue Zeile anzupassen, können Sie [^] oder [\s\S] verwenden. Der Punkt passt nicht übereinstimmen. Dies hat nichts mit dem Flag m zu tun, das damit zu tun hat, ob die Anker (^ und $) am Anfang und Ende der Zeilen übereinstimmen. Andere Regexp-Engines haben eine Syntax, um den Punkt mit Newlines zu vergleichen, und einer wird für eine zukünftige Version von JS vorgeschlagen, aber bis jetzt müssen Sie einen der obigen Ansätze verwenden.

[^] bedeutet wörtlich "Übereinstimmung mit einem beliebigen Zeichen, das nichts ist", was, wie sich herausstellt, eine Zeilenschaltung enthält; [\s\S] bedeutet wörtlich "Übereinstimmung mit einem beliebigen Zeichen, das entweder Leerzeichen oder kein Leerzeichen ist", das auch einen Zeilenumbruch enthält.

derzeit Ihre regexp Unter der Annahme arbeitet mit Ausnahme dieses Newline Problem, verwenden

(?<=%\n)([^]*?)(?=\n%) 

this SO question See. Dazu gibt es einige Informationen in Eloquent JavaScript. Der TC39-Vorschlag (für eine neue s Flagge) ist here.

Verwandte Themen