8

特定の文字列といくつかの可変データに続く文字列を置き換える必要があります。最初と中間を残し、最後だけを置き換える必要があります。以下のコードを試してみると、最後の出現のみが置き換えられます。非貪欲な一致に切り替えようとしましたが、見つかりません。中央には、新しい行だけでなく、スペース、文字、数字を含めることができます。

String s = "Beginning of story. Keep this sentence. Old ending.\n";
s += s;
s += s;
s1 = Regex.Replace(s, @"Beginning of story. ([\s\S]*) Old ending.", "Beginning of story. " + @"$1" + " New ending.", RegexOptions.Multiline | RegexOptions.IgnoreCase);

The result is this:
Beginning of story. Keep this sentence. Old ending.
Beginning of story. Keep this sentence. Old ending.
Beginning of story. Keep this sentence. Old ending.
Beginning of story. Keep this sentence. New ending.

「古いエンディング」の出現をすべて置き換えるにはどうすればよいですか。

4

2 に答える 2

11

Kendall は関連するリンク、貪欲でない一致などで強打していると思います。

s1 = Regex.Replace(s, @"Beginning of story. ([\s\S]*?) Old ending.", "Beginning of story. " + @"$1" + " New ending.", RegexOptions.Multiline | RegexOptions.IgnoreCase);

トリックを行う必要があります。

編集:

また、キャプチャ領域内のパターンを次のように変更できる必要があります。.* where.は、改行文字以外の任意の文字に一致します。

于 2013-06-21T19:12:00.510 に答える
5

で置き換えるだけなら、古き良き string.Replaceを使用してみませんOld endingか? 正規表現を使用するよりも簡単かつ高速になりますNew ending

String s = "Beginning of story. Keep this sentence. Old ending.\n";
s.Replace("Old ending", "New ending");

更新:Old ending前にある場所 を置き換えてからBegining of story...この正規表現を使用する(?<=Beginning of story.*?)Old endingには、わずかなバリエーションがある場合はこれで遊んでください。ただし、これで問題が解決するはずです

Regex.Replace(s, @"(?<=Beginning of story.*?)Old ending", "New ending");

これは基本的に、「古い結末」を「新しい結末」で見つけて置き換えることを意味しますが、「物語の始まり」で始まる場合に限ります

于 2013-06-21T18:56:31.677 に答える