具有替换和提取值的RegEx表达式

本文关键字:RegEx 表达式 提取 替换 | 更新日期: 2023-09-27 18:18:14

我想取一个表达式

(123456789..value > 2000) && (987654321.Value < 12)

提取123456789和987654321(这里可以是任何)

并替换为

ClassName.GetInfo("%s").GetValue()(例)

将这两个值放在%s…的位置

为结果

(ClassName.GetInfo("123456789").GetValue() > 2000) && (ClassName.GetInfo("987654321").GetValue() < 12)

谁能给我一个提示,如何完成这一点?

具有替换和提取值的RegEx表达式

这是一个非常简单的例子,但是应该可以工作。

请注意,下面只允许在您声明(这里可以是任何东西)的地方使用字母数字或'-'或'_'。如果您希望能够使用任何形式的解析器(正则表达式或其他形式)识别它,这是必要的。您需要限制可以用作标识符的字符,或者您需要描述它们并允许转义分隔字符。

private static void Main()
{
    Regex pattern = new Regex(@"(?<Name>['w'-_]+)'.+(?<Value>['w'-_]+)");
    string sample = @"(123456789..value > 2000) && (987654321.Value < 12)";
    string result = pattern.Replace(sample,
                                    m =>
                                    String.Format(
                                        "ClassName.GetInfo('"{0}'").Get{1}{2}()",
                                        m.Groups["Name"].Value,
                                        Char.ToUpper(m.Groups["Value"].Value[0]),
                                        m.Groups["Value"].Value.Substring(1))
        );
    Console.WriteLine(result);
}

程序输出:

(ClassName.GetInfo("123456789").GetValue()> 2000) &&(ClassName.GetInfo("987654321").GetValue () & lt;12)

在您的示例中还有另外两个相当奇怪的行为,上面已经解决了。第一个是使用多个分隔符'..在您的示例"(123456789..value"中。这似乎是一个可能的错误,只需从表达式的这一部分删除'+'。

第二个奇怪之处是,你的例子只是自动神奇地将第一个属性的字符大小写从"value"更正为"value"。尽管我通过确保第一个字符是大写字母来模仿这种神奇的行为,但这并不是一个很好的解决方案。更好的解决方法是使用不区分大小写的字典并查找正确的大小写。

希望这能让你开始,但我必须诚实地说,你还有很长的路要走。解析表达式语言从来都不是一件小事,通常应该避免。如果这是内部使用,只需让他们键入完整版本。如果这是外用…我会重新考虑你是客观的也许构建一个像SQL的QBE这样的图形表达式树会更好地消耗您的时间和精力。