2

グループが関係しているC#で正規表現のグローバル置換を実装する方法の例を高く評価しましたが、空っぽになりました。だから私は自分で書いた。誰かがこれを行うためのより良い方法を提案できますか?

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);
}
4

2 に答える 2

4

ロジックを実行する必要はまったくありません。置換は、置換文字列のグループ参照を使用して実行できます。

string output = Regex.Replace(input, @"word(\d)-(\d)", "wd$1-$2");
于 2012-10-26T06:15:03.660 に答える
2

を渡すことができReplaceますMatchEvaluatorMatchこれは、を取り、置き換えたい文字列を返すデリゲートです。

例えば

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

または、これについてはよくわかりませんが、先読みを使用することもできます。「このテキストが続くことを確認しますが、一致には含めないでください」。構文は(?=whatver)そうなので、次のようなものが必要だと思います。word(?=\d-\d)それを。に置き換えwdます。

于 2012-10-25T19:25:00.010 に答える