通过将值插入到Regex模式中来构造字符串的最简单方法是什么?

时间:2011-09-08 00:24:22

标签: regex string .net-3.5

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

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

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


没有String.Format

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

2 个答案:

答案 0 :(得分:2)

你可以使用正则表达式(yay,meta-regexes!):

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

答案 1 :(得分:0)

我可能已经读错了,但听起来你需要System.Text.RegularExpressions命名空间中的Regex.Replace方法。

string pattern = "Your pattern";
string replacement = "Your text to replace";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

正则表达式库中还有其他方法可以更好地适应单个字符串中的多个替换。