1

ファイル内の文字列の束を置き換えようとしています。文字列は、新しい文字列値とともにデータテーブルに格納されます。

string contents = File.ReadAllText(file);
foreach (DataRow dr in FolderRenames.Rows)
{
    contents = Regex.Replace(contents, dr["find"].ToString(), dr["replace"].ToString());

    File.SetAttributes(file, FileAttributes.Normal);

    File.WriteAllText(file, contents);
}

文字列は次のようになります_-uUa、、-_uUなど_-Ha

私が抱えている問題は、たとえば、この文字列" _uU"も""を上書きする_-uUaため、置換が"newvaluea"のようになる場合です。

見つかった文字列の次の文字を調べて、それが英数字ではないことを確認するように正規表現に指示する方法はありますか?

私がここで何をしようとしているのかが明確になっていることを願っています。サンプルデータは次のとおりです。

private function _-0iX(arg1:flash.events.Event):void
    {
        if (arg1.type == flash.events.Event.RESIZE) 
        {
            if (this._-2GU) 
            {
                this._-yu(this._-2GU);
            }
        }
        return;
    }

次の文字は;、、、、ドット()コンマ、スペース、:などです。

4

3 に答える 3

0

まず、を使用する必要がありますRegex.Escape

その後使用できます

contents = Regex.Replace(
  contents, 
  Regex.Escape(dr["find"].ToString()) + @"(?![a-zA-Z])",
  Regex.Escape(dr["replace"].ToString()));

またはさらに良い

contents = Regex.Replace(
  contents, 
  @"\b" + Regex.Escape(dr["find"].ToString()) + @"\b",
  Regex.Escape(dr["replace"].ToString()));
于 2012-11-24T20:12:19.410 に答える
0

ここで役立つ 2 つのトリックがあります。

  1. すべての検索文字列を長さで並べ替え、最初に最も長いものを置き換えます。これにより、誤って短いものを置き換えることがなくなります。
  2. MatchEvaluator を使用して、すべての行をループする代わりに、文字列内のすべての置換パターンを検索し、データセットでそれらを調べます。

オプション 1 は単純です。オプション 2 は次のようになります。

Regex.Replace(contents", "_-\\w+", ReplaceIdentifier)

public string ReplaceIdentifier(Match m)
{
   DataRow row = FolderRenames.Rows.FindRow("find"); // Requires a primary key on "find"
   if (row != null) return row["replace"];
   else return m.Value;
}
于 2012-11-25T11:02:02.320 に答える
0

これがあなたが探しているものだと思います:

contents = Regex.Replace(
    contents,
    string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(dr["find"].ToString())),
    dr["replace"].ToString().Replace("$", "$$")
);

\b検索文字列が常に単語の文字で開始および終了するとは限らないため、使用できません。代わりに(?<!\w)and(?!\w)を使用して、一致した部分文字列の直前または直後に単語文字 (つまり、文字、数字、またはアンダースコア) が含まれていないことを確認しました。検索文字列の完全な仕様がわからないため、このパターンを微調整する必要があるかもしれません。

あなたが提供したサンプル パターンのいずれにも正規表現のメタ文字が含まれていませんが、他のレスポンダーと同様に、Regex.Escape()とにかく安全にレンダリングしていました。置換文字列で注意しなければならない唯一の文字はドル記号 ( ref ) であり、それをエスケープする方法は別のドル記号を使用することです。String.Replace()の代わりに使用したことに注意してくださいRegex.Replace()

于 2012-11-24T23:35:36.273 に答える