1

一部のHTMLコード内の値を置き換えるために正規表現を使用しています。html コード内のすべてのインスタンスに正しく一致しますが、後方参照で Regex.Replace() を使用すると、後方参照は置き換えられません。

例えば

html = "<td>[element]elementreference='oldvalue';[/element]</td>";

html = Regex.Replace(html, @"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", "$1" +   elementReference.Value + "$2", RegexOptions.IgnoreCase);

結果:

"<td>[element]elementreference=$1newvalue'[/element]</td>"

しかし、私が使用する場合

html = "<td>[element]elementreference='oldvalue';[/element]</td>";

var regex = new Regex(@"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html))
{
    html = html.Replace(match.Value, match.Groups[1] + elementReference.Value + match.Groups[2]);
}

結果は

"<td>[element]elementreference='newvalue'[/element]</td>"

これは私が期待したものです。

Regex.Replace() の使用が機能しなかった理由を説明できる人はいますか?

編集

内部の html を置き換えようとしているのではなく、たまたま html タグにあるの'oldvalue'一部を置き換えようとしています。[element]elementreference='oldvalue'[/element]私の問題は、後方参照を使用して、テキストの周りのアポストロフィを置き換えようとしているという事実にあります。このアポストロフィーは複数の値である可能性があるため、後方参照を使用しています。

4

1 に答える 1

1

コードを試してみると、置換しようとしている値の後にセミコロンがないため、置換も行われません。

正規表現からセミコロンを削除すると、両方とも機能します。

html = Regex.Replace(html, @"(['""#(=])" + "oldvalue" + @"(['""#)]|&)", "$1" + "asdf" + "$2", RegexOptions.IgnoreCase);

以下と同じです:

var regex = new Regex(@"(['""#(=])" + "oldvalue" + @"(['""#)]|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html))
{
    html = html.Replace(match.Value, match.Groups[1] + "asdf" + match.Groups[2]);
}

編集:

質問から更新されたコードを試すと、正常に動作します:

string html;
KeyValuePair<string, string> elementReference = new KeyValuePair<string, string>("oldvalue", "newvalue");

html = "<td>[element]elementreference='oldvalue';[/element]</td>";

html = Regex.Replace(html, @"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", "$1" + elementReference.Value + "$2", RegexOptions.IgnoreCase);

Console.WriteLine(html);

html = "<td>[element]elementreference='oldvalue';[/element]</td>";

var regex = new Regex(@"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html)) {
  html = html.Replace(match.Value, match.Groups[1] + elementReference.Value + match.Groups[2]);
}

Console.WriteLine(html);

出力:

<td>[element]elementreference='newvalue';[/element]</td>
<td>[element]elementreference='newvalue';[/element]</td>
于 2013-03-01T16:00:03.670 に答える