正则表达式替换重复捕获

乔尼·亚当特

我正在创建一个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+\)\],? ?)+)

完美匹配并捕获我的样本:

Expresso匹配输出

我希望整个替换由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表达式?

任何帮助,将不胜感激。

zx81

这是一种更紧凑的正则表达式方法:

搜索: = (@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}");

说明

  • 1组的(@p\d+)捕获@p和数字括号
  • 先行者(?=.*?\1 (= [^\[]+))断言接下来是...
  • .*? 匹配任何字符最多...
  • \1第1组匹配的内容(例如@p0
  • (= [^\[]+))捕获到第2组中的括号是文字=,所有不是a的字符[(我们使用它作为定界符来知道您的值何时结束。这就是您的值
  • 或者...|我们还将匹配字符串的末尾,并且由于匹配时没有第2组,因此替换${2}将取消它
  • ; 分号
  • 为了安全起见,否定先行(?!.*= @p\d)断言其后的字符不是= @p+号
  • .* 匹配分号和所有字符到字符串的末尾
  • 替换字符串${2}=和组2(值)

参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式-重复捕获

来自分类Dev

重复正则表达式捕获组的捕获部分

来自分类Dev

正则表达式不捕获重复的可选捕获

来自分类Dev

是否可以在正则表达式的替换中重复捕获的组?

来自分类Dev

正则表达式捕获重复的短语

来自分类Dev

Python正则表达式findall捕获重复的组

来自分类Dev

捕获重复-PHP中的字母-正则表达式

来自分类Dev

正则表达式-捕获所有重复的迭代

来自分类Dev

Java正则表达式-捕获重复的组

来自分类Dev

多行正则表达式 - 捕获重复组的问题

来自分类Dev

正则表达式捕获组参考 > 重复?

来自分类Dev

捕获重复组的 Java 正则表达式

来自分类Dev

仅在正则表达式中捕获重复组

来自分类Dev

用正则表达式和捕获替换

来自分类Dev

正则表达式替换忽略非捕获组

来自分类Dev

正则表达式捕获和替换

来自分类Dev

正则表达式替换为捕获组

来自分类Dev

仅替换捕获组-正则表达式

来自分类Dev

VB正则表达式。用重复括号替换

来自分类Dev

正则表达式替换重复字符串

来自分类Dev

替换重复模式正则表达式

来自分类Dev

正则表达式-替换重复的字符

来自分类Dev

重复的正则表达式替换与重叠的回味

来自分类Dev

正则表达式替换重复的字符

来自分类Dev

正则表达式替换以删除重复项

来自分类Dev

如何替换正则表达式中的重复?

来自分类Dev

正则表达式由于重复捕获组而不是重复捕获组而不匹配

来自分类Dev

正则表达式捕获“-”字符

来自分类Dev

正则表达式:捕获组?