3

内の文字列値を検索する foreach ステートメントがありますList<string>。読み取られている現在の行に文字列が含まれている場合は、それを置き換えたいのですが、注意が必要です。

foreach (string shorthandValue in shorthandFound)
{
    if (currentLine.Contains(shorthandValue))
    {
        // This method creates the new string that will replace the old one.
        string replaceText = CreateReplaceString(shorthandValue);
        string pattern = @"(?<!_)" + shorthandValue;
        Regex.Replace(currentLine, pattern, replaceText);
        // currentline is the line being read by the StreamReader.
     }
}

shorthandValueアンダースコア文字 ( ) が前にある場合、システムが文字列を無視するようにしようとしています"_"。それ以外の場合は、(行頭であっても) 置き換えてください。

私は正しくやっていないのですか?

アップデート

これはほとんど正しく動作しています:

Regex.Replace(currentFile, "[^_]" + Regex.Escape(shorthandValue), replaceText);

ただし、アンダースコアは無視されますが、shorthandValue 文字列の前にあるスペースはすべて削除されます。そのため、「This is a test123.」という行を読み、「test123」を置き換えると、次の結果になります。

「これは VALUEOFTHESHORTHAND です。」

スペースが削除されるのはなぜですか?

再度更新

正規表現を自分の(?<!_)ものに戻しましたが、スペースが保持されています。

4

2 に答える 2

4

正規表現は正しいです。問題は、Regex.Replaceが新しい文字列を返すことです。

返された文字列を無視しています。

于 2013-01-15T18:23:25.167 に答える
2

文字列を実際に保存するようにコードを修正すると(@jameskyburzへのヒント)、正規表現は正しく見えるので、それがshorthandValueリテラルとして扱われることを確認する必要があります。この使用を達成するにはRegex.Escape

var pattern = String.Format(@"(?<!_){0}", Regex.Escape(shorthandValue))
于 2013-01-15T18:21:45.593 に答える