-1

重複の可能性:
C# の正規表現を使用して HTML タグを削除する

タグを削除し、他のすべての情報を XML ファイルに保持する必要があります。正規表現を使用するとき、私はどういうわけか途方に暮れています。ファイルを 1 行ずつ読み込んでから、すべてのタグを「見つけて」「」 (空の文字列) に置き換えようとすることしか考えられませんでした。ただし、期待どおりに機能していません。

line = Regex.Replace(line, "<.*>", "");

これが期待どおりに機能しない理由を説明してもらえますか (<> 内にあるシンボルのすべての可能な組み合わせを見つけるだけでよいと思います。また、正規表現の適切な紹介をお勧めしてもらえますか。定期的によく読みます-expressions.info しかし、どういうわけか不完全で紛らわしいと思います。

4

3 に答える 3

7

* 量指定子を遅延させて、最後の > ではなく次の > に一致するようにする必要があります。

line = Regex.Replace(line, "<.*?>", "");
于 2013-01-23T18:13:32.473 に答える
2

正規表現で XML を解析しようとすることの無益さは別として (他の誰かがそのリンクを投稿することは間違いありません)、あなたの問題はそれ*貪欲であることです。<ドキュメントの最初と最後の間で可能な限り一致し>ます。

たとえば、次のような場合:

<someTag>some stuff

そしたらうまくいきます。

ただし、これがある場合:

<someTag>some stuff</someTag>

次に、最初<と最後が一致する>ため、タグ間のコンテンツが削除されます。

BlackBearが提案したように、1つの解決策は、貪欲でないようにするために追加?することです。このようにして、最大の一致ではなく、可能な限り最小の一致に一致します。*

しかし、I4V がコメントしているように、より良い解決策は、XML パーサーを使用して XML を解析することです。

于 2013-01-23T18:14:25.527 に答える
1

XML パーサーを使用する必要があるのに、なぜ正規表現で時間を無駄にするのでしょうか?

using (var reader = XmlReader.Create("file.xml"))
{
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
        case XmlNodeType.Text:
        case XmlNodeType.CDATA:
        case XmlNodeType.EntityReference:
        case XmlNodeType.Whitespace:
        case XmlNodeType.SignificantWhitespace:
           Console.Write("{0}", reader.ReadContentAsString());
           break;
        }
    }
}
于 2013-01-23T18:24:00.960 に答える