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);
}
}
}
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);
, 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"
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"
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);
}