Expression régulière remplacer en C#

Je suis assez nouveau pour utiliser des expressions régulières, et, sur la base de quelques tutoriels que j'ai lus, Je ne peux pas obtenir cette étape dans mon Regex.Remplacer correctement formaté.

Voici le scénario sur lequel je travaille... Lorsque je tire mes données de la listbox, je veux les formater dans un format CSV , puis Enregistrer le fichier. L'utilisation de L'option Remplacer est-elle une solution idéale pour ce scénario?

Avant l'exemple de mise en forme d'expression régulière.

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

Format proposé après expression régulière remplacer

John Smith,100000,M

Sortie de l'état de mise en forme actuelle:

John,Smith,100000,M

* Note-est-il possible 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);
        }
    }
}
23
demandé sur Peter Mortensen 2013-04-20 09:37:39

4 réponses

Vous pouvez le faire ceci avec deux remplacements

//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);
32
répondu Anirudha 2013-04-20 06:00:56

, Essayez ceci::

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

C'est à peu près une réponse aussi propre que vous obtiendrez, au moins avec les expressions rationnelles.

  • (\D+): premier groupe de capture. Un ou plusieurs chiffres.
  • \s+\$: Un ou plusieurs caractères d'espacement, puis un littéral signe dollar ($).
  • ([\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 capture groupe. Tout caractère non-rupture de ligne.

Le deuxième groupe de capture doit en outre avoir ses virgules supprimées. Vous pouvez le faire avec une autre expression rationnelle, mais c'est vraiment inutile et mauvais pour les performances. C'est pourquoi nous devons utiliser une expression lambda et un format de chaîne pour assembler le remplacement. Si ce n'était pas pour cela, nous pourrions simplement l'utiliser comme remplacement, à la place de l'expression lambda:

"$1,$2,$3"
15
répondu Zenexer 2013-11-21 02:57:00

Ajouter les 2 lignes

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

Si sb_trim= Jean,Smith,100000,M le code ci-dessus sera de retour "John Smith,100000,M"

3
répondu Patrick D'Souza 2013-04-20 05:52:26

Le code suivant synchronise les sous-titres de films en les déplaçant en arrière 20 secondes:

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

// ...
static void Main(string[] args)
{
    string source = File.ReadAllText("Ocean's Eight [2018] CAM.txt");

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

    source = Regex.Replace(source, pattern, match =>
    {
        DateTime time = DateTime.Parse(match.Value);
        time = time.AddSeconds(-20);
        return time.TimeOfDay.ToString();
    });

    File.WriteAllText("Ocean's Eight [2018] CAM.srt", source);

    Console.Write("Press any key to quit . . . ");
    Console.ReadKey(true);
}
0
répondu Mooncat 2018-08-26 00:29:58