web-dev-qa-db-fra.com

Expression régulière remplacer en C #

J'utilise assez souvent les expressions régulières et, à partir de quelques tutoriels que j'ai lus, je ne parviens pas à mettre cette étape dans mon Regex.Replace correctement formaté.

Voici le scénario sur lequel je travaille ... Lorsque je extrait mes données de la zone de liste, je souhaite les formater au format CSV like, puis enregistrer le fichier. L'utilisation de l'option Remplacer est-elle la solution idéale pour ce scénario?

Avant l'exemple de formatage d'expression régulière.

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

Format proposé après remplacement de l'expression régulière

John Smith,100000,M

Etat actuel du formatage:

John,Smith,100000,M

* Remarque - y a-t-il un moyen de remplacer la première virgule par un espace?

Extrait de mon 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

Vous pouvez le faire avec deux remplaçants

//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

Essaye ça::

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));

Il s’agit d’une réponse aussi nette que possible, du moins avec les regex.

  • (\D+): premier groupe de capture. Un ou plusieurs caractères non numériques.
  • \s+\$: un ou plusieurs caractères d'espacement, puis un signe dollar littéral ($).
  • ([\d,]+): Deuxième groupe de capture. Un ou plusieurs chiffres et/ou virgules.
  • \.\d+: Point décimal, puis au moins un chiffre.
  • \s+: un ou plusieurs caractères d'espacement.
  • (.): troisième groupe de capture. Tout caractère qui ne coupe pas de ligne.

Le second groupe de capture doit en outre être dépouillé de ses virgules. Vous pouvez le faire avec une autre regex, mais c'est vraiment inutile et mauvais pour la performance. C'est pourquoi nous devons utiliser une expression lambda et un format de chaîne pour reconstituer le remplacement. Si ce n’était pas le cas, nous pourrions simplement utiliser ceci comme remplacement, à la place de l’expression lambda:

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

Ajouter les 2 lignes suivantes

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

Si sb_trim = John, Smith, 100000, M le code ci-dessus retournera "John Smith, 100000, M"

3
Patrick D'Souza

Le code suivant synchronise les sous-titres de film en les faisant avancer de 24 secondes:

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