Je crée un log4net
appender qui génère NHibernate
scripts SQL prêts à être exécutés.Regex Remplacer les captures répétées
Je souhaite utiliser Regex pour remplacer la sortie de log4net par un script prêt à l'emploi.
Une entrée de l'échantillon serait
command 5:UPDATE [PlanParameter] SET Mode = @p0, DefaultValueString = @p1, ParameterID = @p2 WHERE ID = @p3;@p0 = 1 [Type: Int16 (0)], @p1 = '0' [Type: String (4000)], @p2 = 2 [Type: Int32 (0)], @p3 = 1362 [Type: Int32 (0)]
Ce que je veux remplacer par
UPDATE [PlanParameter] SET Mode = 1, DefaultValueString = '0', ParameterID = 2 WHERE ID = 1362
J'ai créé le Regex suivant:
command \d+:(?<Query>(?:(?<PreText>[\w\s\[\]]+ =)(@p\d+)(?<PostText>,?))+);(?<Parameters>(?:@p\d+ = ('?\w+'?) \[Type: \w+ \(\d+\)\],? ?)+)
qui correspond et capture parfaitement mes échantillons:
Je voulais que l'ensemble du remplacement soit géré par le moteur Regex. Je pensais que je peux utiliser une chaîne de remplacement comme celle-ci:
${PreText}$2${PostText}
mais que les rendements que la dernière capture, et non mon objectif final.
En attendant, je l'ai utilisé C# pour y arriver:
Regex reg = new Regex(@"command \d+:(?<Query>(?:(?<PreText>[\w\s\[\]]+ =)(@p\d+)(?<PostText>,?))+);(?<Parameters>(?:@p\d+ = ('?\w+'?) \[Type: \w+ \(\d+\)\],? ?)+)", RegexOptions.Compiled);
string sample = @"command 5:UPDATE [PlanParameter] SET Mode = @p0, DefaultValueString = @p1, ParameterID = @p2 WHERE ID = @p3;@p0 = 1 [Type: Int16 (0)], @p1 = '0' [Type: String (4000)], @p2 = 2 [Type: Int32 (0)], @p3 = 1362 [Type: Int32 (0)]";
Match match = reg.Match(sample);
string result = match.Groups["Query"].Value;
for (int i = 0; i < match.Groups[1].Captures.Count; i++)
{
Capture capture = match.Groups[1].Captures[i];
result = result.Replace(capture.Value, match.Groups[2].Captures[i].Value);
}
Cela fonctionne parfaitement, mais je suis sûr qu'il ya une façon plus propre et soignée de faire cela. Peut-être avec une expression Regex différente peut-être?
Toute aide serait appréciée.
+1 pour expérimenter avec CaptureCollection :) – zx81