これはあなたが探していることをするはずです。ただし、不正なマークアップがある場合は処理されません。たとえば、入力 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 文字ずつ反復処理しています。オープニングを見つけ<
たら、クロージングを見つけるまで入力を出力に追加しない状態に入ります>
。
出力文字列を生成する方法は、StringBuilder
to do 文字列連結を使用することです。これにより、単に を使用するよりもパフォーマンスが向上しますstring output += input[i]
。string
2 つの文字列を連結するたびに、完全に新しい別個の文字列が割り当てられるため、単に出力変数の型として a を使用することはお勧めしません。時間の経過とともに、これはパフォーマンスに影響を与えます。を使用するStringBuilder
と、文字列オブジェクトが 1 つだけ割り当てられ、ループの反復ごとに新しい文字列オブジェクトが作成されることはありません。
Microsoft はを使用する理由について適切な説明を書いてStringBuilder
いますが、一般的な規則として、ループ内で文字列を連結している場合はいつでも StringBuilder を使用する必要があります。
逆に、入力文字列が常に小さいことがわかっている状況では、StringBuilder
. StringBuilder
少数の文字列のみを連結している場合、克服されないオブジェクトを作成するためのペナルティがあります。たとえば、10 個の文字列連結のみを行うと予想される場合、StringBuilder を使用することはアンチパターンと見なされます。ただし、この例のように何百もの文字列を連結している場合は、StringBuilder
.