0

正規表現が一致する前に新しい行を挿入しようとしています。現在、ArgumentOutOfRangeException が発生しています。挿入するすべての改行文字 (合計 4 文字) に対してインデックスをオフセットする必要があることを認識しています。

これを回避する方法を知っていますか?

ありがとう!

string origFileContents = File.ReadAllText(path);

string cleanFileContents = origFileContents.Replace("\n", "").Replace("\r", "");

Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(cleanFileContents);

int counter = 0;

foreach (Match match in matches)
{
    cleanFileContents.Insert(match.Index + 4 * counter, Environment.NewLine);
    counter++;
}
4

3 に答える 3

4

なぜだけではないのですか

cleanFileContents = regex.Replace(
    cleanFileContents,
    Environment.NewLine + "$0");

とはいえ、問題は、Environment.NewLine.Lengthがおそらく4ではなく2である可能性があります。編集:また、Cyborgが指摘しているように、Insertは文字列を変更せず、新しい文字列を返します。

ちなみに、リテラルブラケットを一致させようとしている場合は、それらをエスケープする必要があります。

于 2013-01-31T18:27:51.207 に答える
1

このコードには、少なくともこれらの識別可能な問題が見られます。

  1. "\r\n"は 4 文字ではなく 2 文字です。使用する必要がありますEnvironment.NewLine.Length * counter

  2. cleanFileContents.Insert(...)新しい文字列を返します。「cleanFileContents」は変更されません。次のようなものが必要ですcleanFileContents = cleanFileContents.Insert(...)

推奨される編集:

string origFileContents = File.ReadAllText(path);

// Changed cleanFileContents to a StringBuilder for performance reasons
var cleanFileContents = New StringBuilder( origFileContents.Replace("\n", "").Replace("\r", "") );

Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(cleanFileContents.ToString());

int counter = 0;

foreach (Match match in matches)
{
    cleanFileContents.Insert(match.Index + Environment.NewLine.Length * counter, Environment.NewLine);
    counter++;
}

var result = cleanFileContents.ToString()
于 2013-01-31T18:34:29.833 に答える
0

match.Index
+ 4 * counter
you do know * は + ? の前に適用されます。

Cyborgx37 と同様 - この
ReadAllLines を開始したときには投稿されていませんでした 改行で分割する方が速いかもしれません

Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
StringBuilder sbAll = new StringBuilder();
StringBuilder sbLine = new StringBuilder();
foreach (string line in System.IO.File.ReadAllLines("path"))
{
    sbLine.Append(line);
    MatchCollection matches = regex.Matches(line);

    int counter = 0;

    foreach (Match match in matches)
    {
        sbLine.Insert(match.Index + Environment.NewLine.Length * counter, Environment.NewLine);
        counter++;
    }
    sbAll.Append(line);
    sbLine.Clear();
}
于 2013-01-31T17:53:06.793 に答える