3

私は次の文字列を持っています:

<div id="mydiv">This is a "div" with quotation marks</div>

正規表現を使用して次を返したい:

<div id='mydiv'>This is a "div" with quotation marks</div>

divのid属性がアポストロフィで囲まれていることに注目してください。

正規表現でこれを行うにはどうすればよいですか?

編集:私はあらゆる状況であらゆるエッジケースを処理するための魔法の弾丸を探していません。HTMLを解析するために正規表現を使用することにうんざりしているはずですが、この特定のケースでは、そして私の特定のニーズのために、正規表現が解決策です...正しい表現を得るのに少し助けが必要です。

編集#2:イェンスは私のための解決策を見つけるのを手伝ってくれましたが、このページにランダムにアクセスする人は誰でも、この解決策の使用について長くそして非常に懸命に考える必要があります。私の場合、これは、処理する文字列のタイプに非常に自信があるために機能します。私は危険とリスクを知っており、あなたがそうすることを確認します。知っているかどうかわからない場合は、おそらくこの方法を知らないので使用すべきではないことを示しています。あなたは警告されました。

4

3 に答える 3

2

これは次の方法で行うことができます。aとaの間"にあるのすべてのインスタンスを。に置き換えたいと思います。<>'

したがって、"ファイル内でそれぞれを探し、後ろを探し、<前を探します>。正規表現は次のようになります。

(?<=\<[^<>]*)"(?=[^><]*\>)

見つかった文字をお好みに合わせて置き換えることができます。おそらくを使用しRegex.Replaceます。

注:Stack Overflowコミュニティは最もフレンドリーで役立つと思いましたが、私の意見では、これらの正規表現/HTMLの質問には少し怒りすぎて答えています。結局のところ、ここでのこの質問は、「どの正規表現がすべての有効なHTMLに一致し、他の何にも一致しない」という質問ではありません。

于 2010-03-15T14:59:26.547 に答える
2

この種の置換を行うために正規表現を使用することの危険性をご存知だと思います。入力ドキュメントが変更されても機能し続けるソリューションが必要な場合は、より「安定した」メソッドを探している人のために、次の回答を追加しました。

HTML Agility Pack(プロジェクトページnuget)を使用すると、次のようなトリックが実行されます。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);
于 2012-03-19T09:54:07.720 に答える
0

あなたは一致することができます:

(<div.*?id=)"(.*?)"(.*?>)

これを次のように置き換えます。

$1'$2'$3
于 2010-03-15T15:03:16.310 に答える