0

htmlタグの間のテキストを削除して、textBox2に表示したいです。「<」と「>」の開始位置を取得してから、タグとその間のすべてを削除する必要があります。正規表現を使用したくありません。

これが私がこれまでに得たものです

        string input = textBox1.Text;
        string output = textBox2.Text;
        string results;
        for (int i = 0; i < input.Length; i++)
        {
            if(input.IndexOf('<',i) !=-1 )
            {


            }
4

1 に答える 1

2

これはあなたが探していることをするはずです。ただし、不正なマークアップがある場合は処理されません。たとえば、入力 string を入力するHello < worldと、出力は になりますHello

string input = textBox1.Text;
StringBuilder output = new StringBuilder(input.Length);
bool inATag = false;

for (var i = 0; i < input.Length; i++) {
    if (!inATag && input[i] != '>' && input[i] != '<') {
        output.Append(input[i]);
    } else if (input[i] == '<') {
        inATag = true;
    } else if (input[i] == '>') {
        inATag = false;
    }
}

textBox2.Text = output.ToString();

何が起こっているのかをもう少し説明するために、入力文字列を一度に 1 文字ずつ反復処理しています。オープニングを見つけ<たら、クロージングを見つけるまで入力を出力に追加しない状態に入ります>

出力文字列を生成する方法は、StringBuilderto do 文字列連結を使用することです。これにより、単に を使用するよりもパフォーマンスが向上しますstring output += input[i]string2 つの文字列を連結するたびに、完全に新しい別個の文字列が割り当てられるため、単に出力変数の型として a を使用することはお勧めしません。時間の経過とともに、これはパフォーマンスに影響を与えます。を使用するStringBuilderと、文字列オブジェクトが 1 つだけ割り当てられ、ループの反復ごとに新しい文字列オブジェクトが作成されることはありません。

Microsoft はを使用する理由について適切な説明を書いてStringBuilderいますが、一般的な規則として、ループ内で文字列を連結している場合はいつでも StringBuilder を使用する必要があります。

逆に、入力文字列が常に小さいことがわかっている状況StringBuilder . StringBuilder少数の文字列のみを連結している場合、克服されないオブジェクトを作成するためのペナルティがあります。たとえば、10 個の文字列連結のみを行うと予想される場合、StringBuilder を使用することはアンチパターンと見なされます。ただし、この例のように何百もの文字列を連結している場合StringBuilder.

于 2012-12-19T06:01:41.643 に答える