我正在创建一个log4net
生成器,该生成器生成NHibernate
准备执行的SQL脚本。
我想使用Regex将log4net的输出替换为准备使用的脚本。
样本输入为
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)]
我想替换为
UPDATE [PlanParameter] SET Mode = 1, DefaultValueString = '0', ParameterID = 2 WHERE ID = 1362
我创建了以下正则表达式:
command \d+:(?<Query>(?:(?<PreText>[\w\s\[\]]+ = )(@p\d+)(?<PostText>,?))+);(?<Parameters>(?:@p\d+ = ('?\w+'?) \[Type: \w+ \(\d+\)\],? ?)+)
完美匹配并捕获我的样本:
我希望整个替换由Regex引擎处理。我以为可以使用这样的替换字符串:
${PreText}$2${PostText}
但这只会产生最后的捕获,而不是我的最终目标。
同时,我使用C#来实现:
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);
}
这可以完美地工作,但是我敢肯定有一种更干净,更整洁的方式来做到这一点。也许使用不同的Regex表达式?
任何帮助,将不胜感激。
这是一种更紧凑的正则表达式方法:
搜索: = (@p\d+)(?=.*?\1 (= [^\[]+))|;(?!.*= @p\d).*
更换: ${2}
这会将所有参数替换为其值,并擦除字符串的结尾。
请参阅regex演示底部的“替换”窗格。
输出:
command 5:UPDATE [PlanParameter] SET Mode = 1 , DefaultValueString = '0' , ParameterID = 2 WHERE ID = 1362
示例C#
String replaced = Regex.Replace(yourString, @"= (@p\d+)(?=.*?\1 (= [^\[]+))|;(?!.*= @p\d).*", "${2}");
说明
(@p\d+)
捕获@p
和数字括号(?=.*?\1 (= [^\[]+))
断言接下来是....*?
匹配任何字符最多...\1
第1组匹配的内容(例如@p0
)(= [^\[]+))
捕获到第2组中的括号是文字=
,所有不是a的字符[
(我们使用它作为定界符来知道您的值何时结束。这就是您的值|
我们还将匹配字符串的末尾,并且由于匹配时没有第2组,因此替换${2}
将取消它;
分号(?!.*= @p\d)
断言其后的字符不是= @p
+号.*
匹配分号和所有字符到字符串的末尾${2}
是=
和组2(值)参考
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句