Frage

Wie kann ich einzelne Instanzen von durch (LF allein durch CRLF) mithilfe eines regulären Ausdrucks in C# ersetzen?

Tut mir leid, wenn es eine dumme Frage ist, ich bin neu bei Regex.

Ich weiß, dass man es mit einem Plan machen kann String.Replace, wie:

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

Dies ist jedoch unelegant und würde alle „ + “ bereits im Text zerstören (obwohl es unwahrscheinlich ist, dass sie existieren).

War es hilfreich?

Lösung

Wird das reichen?

[^\r]\n

Grundsätzlich entspricht es einem „ “, dem ein Zeichen vorangestellt ist, das nicht „ “ ist.

Wenn Sie möchten, dass auch Zeilen erkannt werden, die nur mit einem einzelnen „ “ beginnen, versuchen Sie es

([^\r]|$)\n

Das heißt, dass es mit einem „ “ übereinstimmen sollte, aber nur mit denen, die das erste Zeichen einer Zeile sind oder solche, die es sind nicht mit vorangestelltem ' '

Möglicherweise müssen Sonderfälle überprüft werden, da Sie mit der Definition der Zeilen selbst herumspielen. Das „$“ funktioniert möglicherweise nicht so gut.Aber ich denke, Sie sollten es verstehen.

BEARBEITEN: Credit @Kibbee Die Verwendung von Look-Ahead-S ist eindeutig besser, da das übereinstimmende vorhergehende Zeichen nicht erfasst wird und auch bei Randfällen hilfreich sein sollte.Hier ist also ein besserer regulärer Ausdruck + der Code wird:

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");

Andere Tipps

Es könnte schneller sein, wenn Sie dies verwenden.

(?<!\r)\n

Grundsätzlich wird nach jedem gesucht, dem kein vorangestellt ist.Dies wäre höchstwahrscheinlich schneller, da im anderen Fall fast jeder Buchstabe mit [^ ] übereinstimmt, also würde es das erfassen und dann nach dem danach suchen.In dem Beispiel, das ich gegeben habe, würde es erst anhalten, wenn es ein gefunden hat, und vorher wird geprüft, ob es gefunden hat

Ich habe versucht, den folgenden Code in eine Zeichenfolge umzuwandeln, aber es hat nicht funktioniert.

myStr.Replace("(?<!\r)\n", "\r\n")

Ich habe Regex.Replace verwendet und es hat funktioniert

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")

Ich vermute, dass „myStr“ ein Objekt vom Typ String ist. In diesem Fall handelt es sich nicht um einen regulären Ausdruck. und sind die Äquivalente für CR und LF.

Meine beste Vermutung ist, dass Sie, wenn Sie wissen, dass Sie für JEDE Zeile ein haben, egal was passiert, zuerst jedes entfernen sollten.Dann ersetzen Sie alle durch .

Die Antwort, die Chakrat gibt, würde auch gehen, aber dann müssen Sie Regex verwenden, aber da Sie nicht sagen, was „myStr“ ist ...

Bearbeiten: Ein Blick auf die anderen Beispiele sagt mir eines.Warum die schwierigen Dinge tun, wenn man es einfach tun kann? Weil es Regex gibt, ist das nicht dasselbe wie „muss verwendet werden“ :D

Edit2:Ein Tool ist sehr wertvoll, wenn man mit Regex, XPath und so weiter herumhantiert und seltsame Ergebnisse liefert. Darf ich Sie darauf hinweisen: http://www.regexbuddy.com/

myStr.Replace("([^\r])\n", "$1\r\n");

$ muss möglicherweise ein \ sein

Versuche dies:Ersetzen(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

Wenn ich weiß, dass die Zeilenenden entweder CRLF oder LF sein müssen, funktioniert das für mich

myStr.Replace("\r?\n", "\r\n");

Dies bewirkt im Wesentlichen das Gleiche neslekkiMist die Antwort, mit der Ausnahme, dass nur eine Ersetzungsoperation für die Zeichenfolge und nicht zwei durchgeführt wird.Dies ist auch mit Regex-Engines kompatibel, die keine negativen Lookbehinds oder Rückreferenzen unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top