次のような文字列があります。
ListViewSubItem: {Debian6/Debian6.vmx }
次の出力を取得する最も効率的な方法は次のとおりです。
Debian6/Debian6.vmx
int beginidx = haystack.IndexOf('{');
string needle = haystack.SubString(beginidx,
haystack.IndexOf('}') - beginidx + 1).Trim();
string result = Regex.Match("ListViewSubItem: {Debian6/Debian6.vmx }", @"(?<={)(.+?)(?=})").Value;
正規表現を使用できます:
\{\s*(.*)\s*\}
目的の文字列は、最初にキャプチャされたグループ ( Match.Groups[1]
) に含まれます。
例:
string output = Regex.Match(input, @"\{\s*(.*?)\s*\}").Groups[1].Value;
指摘されたように、正規表現はプレーンな文字列操作よりも遅くなります。パフォーマンスが問題で、文字列の抽出がタイトなループにある場合は、最適化された方法を使用することをお勧めします。それ以外の場合、正規表現と文字列は個人的な好みの問題です。
その文字列を自分で生成しなかったと思います。問題は、なぜそれを解析するのかということです。これは、一歩下がって何を解決しようとしているのか、別の方法がよりクリーンであるかどうかを考える必要があるような質問のように見えます。
私はそのクラスに詳しくありませんListViewSubItem
が、あなたはこれらのクラスの 1 つを持っていて、ToString()
それを呼び出したようです。の出力を解析してToString()
、サブアイテムが表すモデル オブジェクトを確認します。
これは後ろ向きに見えませんか?揮発性で、そのクラスのメソッドの実装に依存しているように見える戻り値をいじるのではなく、オブジェクト自体を処理する必要があるかもしれませんListViewSubItem
(ドキュメントを簡単に見ると、必要なものはプロパティのようです)。そうではない可能性が高く、理論的にはリリースごとに変更される可能性があります)。「文字列に文字が含まれているとどうなるか」などのコーナーケースは言うまでもありません。Text
ToString()
ToString()
}
これには他の理由もありますが、原則として、データ ソースが常にメモリ内にある場合はシリアル化を処理する必要はないと思います。
つまり、要約すると、次のようなものがある場合:
ListViewSubItem item = /* ... */;
string s = item.ToString();
// TODO: parse {Debian} out of ListViewSubItem {Debian}
代わりにこれではないのはなぜですか:
ListViewSubItem item = /* ... */;
string OS = item.Text;