regex - 通过将值插入正则表达式模式来构造字符串的最简单方法?

标签 regex string .net-3.5

我通常最终会得到很多条件和/或循环来解析正则表达式并将值插入到其捕获组中,并且我正在寻找有经验的答案以希望以简单的方式解决这个问题。

例如,给定一个正则表达式模式,如 X(?<xid>\d+)-(?<xsub>\w+)\.xml具有命名的捕获组“xid”和“xsub”,旨在匹配文件名,如: X1-foo.xml , X555-bar.xml 等,当提供参数时:int xid=999, string xsub="baz" ,我想将这些值插入到模式组中以构建正确的文件名: X999-baz.xml

为简单起见,不嵌套显式捕获。

没有 String.Format :

使用 .NET 字符串格式项(如 String.Format("X{0}-{1}.xml", xid, xsub))可以轻松实现此概念。但是,我已经有一个 Regex 模式来从任何文件名字符串中解析出这些值,并且希望使用相同的模式通过用它重建文件名来朝相反的方向前进,以确保准确性。如果我需要一个正则表达式模式来解析字符串中的值,但需要一个带有格式项的字符串来重建文件名,则需要使用两种不同的语法,在编写它们时会产生更大的手动错误机会 - 这太容易了错误地创建一个错误的格式项字符串,该字符串不能正确重建正则表达式模式匹配的结果,反之亦然。

最佳答案

您可以使用正则表达式(是的,元正则表达式!):

public static string RegexInterp(Regex pattern, Dictionary<string, string> pairs) {
    string regex = pattern.ToString();
    string search;

    foreach(KeyValuePair<string, string> entry in pairs) 
    {
        // using negative lookbehind so it doesn't match escaped parens
        search = @"\(\?<" + entry.Key + @">.*?(?<!\\)\)"; 
        regex  = Regex.Replace(regex, search, entry.Value);
    }

    return Regex.Unescape(unescaped);
}

进而:
Regex rx = new Regex(@"X(?<xid>\d\d+)-(?<xsub>\w+)\.xml");

var values = new Dictionary <string, string>() {{"xid", "999"},
                                                {"xsub", "baz"}} ;

Console.WriteLine(RegexInterp(rx, values));     

打印
X999-baz.xml

演示:http://ideone.com/QwI2W

关于regex - 通过将值插入正则表达式模式来构造字符串的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7341923/

相关文章:

c# - 错误运算符 '=='无法应用于 'char'和 'string'类型的操作数

java - RegExp 匹配由有限字符集形成的字符串而不重复使用任何字符

c - 这个 "make a triangle loop"循环超过必要时间的任何原因

.net - 正则表达式反向引用对于输入 : 'UserProfile' and 'user-profile' 是相等的

javascript - 正则表达式匹配与 jQuery 不同

Python:如何将嵌套括号与正则表达式匹配?

c# - 是否可以为 C# 接口(interface)定义 "shared"方法?

python - 如何替换 Python 中第一次出现的正则表达式?

c# - C# 中的多语言 MessageBox

.net - WCF - 如何增加消息大小配额