gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:23:47 26 4
gpt4 key购买 nike

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

例如,给定一个正则表达式模式,如 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com