C# 如何将正则表达式编号的组资本化

C# 如何将正则表达式编号的组资本化,c#,regex,C#,Regex,假设我有一个正则表达式模式,我想用其他东西替换该模式的匹配项。在当前模式中,有两个组将匹配,每个组都编号为($1和$2): CSS选择器示例: [id^="blah"] 预期产出: [start-swith(@ID,"blah")] // Note ID is capitalized 下面是另一个正则表达式模式: Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\*=([^\]]+)\]"); string replacement = "[con

假设我有一个正则表达式模式,我想用其他东西替换该模式的匹配项。在当前模式中,有两个组将匹配,每个组都编号为($1和$2):

CSS选择器示例:

[id^="blah"]
预期产出:

[start-swith(@ID,"blah")] // Note ID is capitalized
下面是另一个正则表达式模式:

Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\*=([^\]]+)\]");
string replacement = "[contains(@$1,$2)]");
当我执行替换时,有没有办法将$1组中的匹配项资本化

注意:我有许多模式被添加到列表中,并且它们与替换字符串成对出现,因此我必须使解决方案适用于所有需要一些匹配组大写的替换

更新 我想我刚刚想到了一个可能的解决方案:将替换字符串转换为
MatchEvaluator
,并在需要时返回大写的组匹配项。我认为这可能有效:

Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\^=([^\]]+)\]");
MatchEvaluator evaluator = new MatchEvaluator((Match m) =>
    {
        return string.Format("[starts-with(@{0},{1})]", m.Groups[1].Value.ToUpper(), m.Groups[2].Value);
    });

如果有人能想出更好的解决办法,请告诉我。非常感谢

MatchEvaluator很好,我想你烧了我;)无论如何:


您的预期输出的几个示例将有助于澄清您的意图。@tom_yes_tom我添加了一个示例。然而,我突然意识到,我可能能够使用MatchEvaluator并选择组。
charc+=('a'-'a')
技巧在c中有效吗?
Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\^=([^\]]+)\]");
MatchEvaluator evaluator = new MatchEvaluator((Match m) =>
    {
        return string.Format("[starts-with(@{0},{1})]", m.Groups[1].Value.ToUpper(), m.Groups[2].Value);
    });
var pattern = @"([a-z]+) ([a-z]+)";
var format = "[starts-with({0}{1}]";

var input = "bla bla";
var result = ReplacePattern(input, pattern, format);

public static string ReplacePattern(string input, string pattern, string format)
{
   if (Regex.Match(input, pattern).Groups.Count != 3) return input;//or throw, or...
   return Regex.Replace(input, pattern, x =>
            string.Format(format,
                          x.Groups[1].Value.ToUpper(), 
                          x.Groups[2].Value));
}