Wie kann ich einen Zeilenumbruch in einem text mit regex?
Ich habe eine Textdatei mit mehreren Zeilen. Ich werde versuchen, ein Muster zu fügen Sie eine neue Wagenrücklauf in einigen Zeilen der text. Diese Linien sind so, dass
lorem ipsum.
dolor sit amet, consectetur adipiscing elit [FIS] Donec feugiat
Gut, das Muster ist eine Linie, gefolgt von anderen, die einige Charaktere und ein '[' Charakter zu. Wenn '[' ist nicht vorhanden das Muster schlägt fehl, und der Wagenrücklauf hat nicht Hinzugefügt werden.
Wie kann ich mit regulären Ausdrücken??
Ich bin mit C# als Programmiersprache und die regex-engine zu.
- Die Antwort auf meine Frage ist hier: stackoverflow.com/questions/767869/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, fügen Sie einen Zeilenumbruch nach einer . dann müssen Sie nur ersetzen Sie es mit sich selbst und einem Zeilenumbruch. Um sicherzustellen, dass es ist das Letzte Zeichen, verwenden Sie einen lookahead, um es zu überprüfen ist, gefolgt von Leerzeichen, d.h.
(?=\s)
So, zu ersetzen durch newline-Zeichen (empfohlen für die meisten Situationen):
Wenn Sie muss Verwendung Wagenrücklauf (und es gibt sehr wenige Orte, die erfordern es, auch auf Windows), können Sie fügen Sie einfach ein:
Wenn Sie sicherstellen möchten, dass ein . ist immer gefolgt von zwei Zeilenumbrüchen, und verursachen keine zusätzlichen Zeilenumbrüche, wenn Sie schon wollen, dann wird es ein wenig komplexer und benötigt eine negative lookahead, aber sieht so aus:
Weil regex-engines Standard zu gierig, die
{0,2}
wird versuchen, zweimal, dann einmal, dann null mal - an welchem Punkt der negativen lookahead für einen nicht-Raum macht Sie sicher, es ist wirklich das Ende eines Wortes.(Wenn Sie möglicherweise mehr als zwei Zeilenumbrüche und möchten auf zwei begrenzen, können Sie einfach
{0,}
statt, die*
als Abkürzung der Schreibweise.)Es ist wohl Wert, darauf hinzuweisen, dass keines der obigen verbrauchen keine Leerzeichen/tabs - wenn dies gewünscht wird, ist die lookaheads können entweder geändert von
(?=\s)
zu\s+
Sie können nicht eine zweite zu ersetzen, der\n[ \t]+
mit\n
zu entfernen führende Leerzeichen/tabs, oder etwas ähnliches, je nach genau das, was Sie zu tun versuchen.[
gefunden wird? Wenn dem so ist, das mittlere Beispiel kann aktualisiert werden, um\.(?=\s++[^\[])
- vorausgesetzt, Ihr regex-engine unterstützt possessive Quantoren sowieso was Geschmack von regex sind Sie mit diesem mit?\s++
wird(?>\s+)
und es sollte ansonsten die gleiche Arbeit.Ich glaube, Sie verwenden können, \r für carriage return und \n für neue Zeile
Was Geschmack? Hier ist es getan für C#:
EDIT: das oben ist eine Antwort auf die ursprüngliche Frage. Nach der hervorragenden Antwort von Peter Boughton, ich muss nicht viel hinzufügen. Naja, vielleicht, ein wenig regex ohne look-around-assertions, einfach ersetzen wird, werden alle Punkte, gefolgt von einem oder mehr Zeilenumbrüche durch zwei Zeilenumbrüche.