it-swarm.com.de

Regulärer Ausdruck in C # ersetzen

Ich bin relativ neu in der Verwendung regulärer Ausdrücke, und basierend auf ein paar Tutorials, die ich gelesen habe, kann ich diesen Schritt in meinem Regex.Replace nicht richtig formatieren.

Hier ist das Szenario, an dem ich gerade arbeite ... Wenn ich meine Daten aus dem Listenfeld ziehe, möchte ich sie in ein CSV - ähnliches Format formatieren und dann die Datei speichern. Ist die Verwendung der Option Ersetzen eine ideale Lösung für dieses Szenario?

Vor dem Formatierungsbeispiel für reguläre Ausdrücke.

FirstName LastName Salary    Position
-------------------------------------
John      Smith    $100,000.00  M

Vorgeschlagenes Format nach Ersetzen des regulären Ausdrucks

John Smith,100000,M

Aktuelle Ausgabe des Formatierungsstatus:

John,Smith,100000,M

* Hinweis - gibt es eine Möglichkeit, das erste Komma durch ein Leerzeichen zu ersetzen?

Ausschnitt aus meinem Code

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
{
    using(var sw = new StreamWriter(fs))
    {
        foreach (string stw in listBox1.Items)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(stw);

            //Piecing the list back to the original format
            sb_trim = Regex.Replace(stw, @"[$,]", "");
            sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", "");
            sb_trim = Regex.Replace(sb_trim, @"\s", ",");
            sw.WriteLine(sb_trim);
        }
    }
}
26
Curtis

Sie können dies mit zwei Ersetzungen tun

//let stw be "John Smith $100,000.00 M"

sb_trim = Regex.Replace(stw, @"\s+\$|\s+(?=\w+$)", ",");
//sb_trim becomes "John Smith,100,000.00,M"

sb_trim = Regex.Replace(sb_trim, @"(?<=\d),(?=\d)|[.]0+(?=,)", "");
//sb_trim becomes "John Smith,100000,M"

sw.WriteLine(sb_trim);
42
Anirudha

Versuche dies::

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)",
    m => string.Format(
        "{0},{1},{2}",
        m.Groups[1].Value,
        m.Groups[2].Value.Replace(",", string.Empty),
        m.Groups[3].Value));

Dies ist eine so klare Antwort, wie Sie sie bekommen, zumindest mit Regex.

  • (\D+): Erste Erfassungsgruppe. Ein oder mehrere nichtstellige Zeichen.
  • \s+\$: Ein oder mehrere Leerzeichen, dann ein Dollarzeichen ($).
  • ([\d,]+): Zweite Erfassungsgruppe. Eine oder mehrere Ziffern und/oder Kommas.
  • \.\d+: Dezimalpunkt, dann mindestens eine Ziffer.
  • \s+: Ein oder mehrere Abstandszeichen.
  • (.): Dritte Erfassungsgruppe. Ein beliebiges Zeichen ohne Zeilenumbruch.

Für die zweite Capture-Gruppe müssen außerdem die Kommas entfernt werden. Sie könnten dies mit einem anderen Regex tun, aber es ist wirklich unnötig und für die Leistung schlecht. Aus diesem Grund müssen wir einen Lambda-Ausdruck und ein String-Format verwenden, um den Ersatz zusammenzusetzen. Wenn das nicht wäre, könnten wir dies anstelle des Lambda-Ausdrucks einfach als Ersatz verwenden:

"$1,$2,$3"
15
Zenexer

Fügen Sie die folgenden 2 Zeilen hinzu

var regex = new Regex(Regex.Escape(","));
sb_trim = regex.Replace(sb_trim, " ", 1);

Wenn sb_trim = John, Smith, 100000, M wird der obige Code "John Smith, 100000, M" zurückgeben.

3
Patrick D'Souza

Der folgende Code synchronisiert Filmuntertitel, indem er 24 Sekunden nach vorne verschoben wird:

using System;
using System.IO;
using System.Text.RegularExpressions;

// ...
static void Main(string[] args)
{
    string source = File.ReadAllText("Fantastic Beasts The Crimes of Grindelwald [2018] CAM.txt");

    string pattern = @"\d{2}:\d{2}:\d{2}";

    source = Regex.Replace(source, pattern, match =>
    {
        DateTime time;
        if (DateTime.TryParse(match.Value, out time))
        {
            time = time.AddSeconds(24);
            return time.TimeOfDay.ToString();
        }

        return match.Value;
    });

    File.WriteAllText("Fantastic Beasts The Crimes of Grindelwald [2018] CAM.srt", source);

    Console.Write("Press any key to quit . . . ");
    Console.ReadKey(true);
}
0
Bilal