正则表达式全局替换为组

时间:2012-10-25 19:18:41

标签: c# regex

我看起来很高和很低的例子,说明如何在C#中实现Regex全局替换,其中有涉及的组,但我是空的。所以我写了自己的。任何人都可以提出更好的方法吗?

static void Main(string[] args)
{
    Regex re = new Regex(@"word(\d)-(\d)");
    string input = "start word1-2 filler word3-4 end";
    StringBuilder output = new StringBuilder();
    int beg = 0;
    Match match = re.Match(input);
    while (match.Success)
    {
        // get string before match
        output.Append(input.Substring(beg, match.Index - beg));

        // replace "wordX-Y" with "wdX-Y"
        string repl = "wd" + match.Groups[1].Value + "-" + match.Groups[2].Value;
        // get replacement string
        output.Append(re.Replace(input.Substring(match.Index, match.Length), repl));

        // get string after match
        Match nmatch = match.NextMatch();
        int end = (nmatch.Success) ? nmatch.Index : input.Length;
        output.Append(input.Substring(match.Index + match.Length, end - (match.Index + match.Length)));

        beg = end;
        match = nmatch;
    }
    if (beg == 0)
        output.Append(input);
}

2 个答案:

答案 0 :(得分:4)

您根本不需要做任何逻辑,可以使用替换字符串中的组引用来完成替换:

string output = Regex.Replace(input, @"word(\d)-(\d)", "wd$1-$2");

答案 1 :(得分:2)

您可以传递Replace一个MatchEvaluator。它是一个委托,它接受一个Match并返回你要用它替换它的字符串。

e.g。

string output = re.Replace(
    input,
    m => "wd" + m.Groups[1].Value + "-" + m.Groups[2].Value);

或者,我对此不太了解,您可以使用 lookahead - “检查此文本是否如此,但不要在匹配中包含它”。语法为(?=whatver),因此我认为您需要word(?=\d-\d)之类的内容,然后将其替换为wd