我有一个字符串如下:
ListViewSubItem: {Debian6/Debian6.vmx }
获得以下输出的最有效方法是什么:
Debian6/Debian6.vmx
int beginidx = haystack.IndexOf('{');
string needle = haystack.SubString(beginidx,
haystack.IndexOf('}') - beginidx + 1).Trim();
您可以使用正则表达式:
\{\s*(.*)\s*\}
所需的字符串将位于第一个捕获的组 ( Match.Groups[1]
) 中。
例子:
string output = Regex.Match(input, @"\{\s*(.*?)\s*\}").Groups[1].Value;
正如所指出的,正则表达式比普通字符串操作慢。如果性能是一个问题,并且字符串提取处于紧密循环中,那么使用优化的方法可能会更好。否则,正则表达式与字符串在恕我直言是个人喜好问题。
string result = Regex.Match("ListViewSubItem: {Debian6/Debian6.vmx }", @"(?<={)(.+?)(?=})").Value;
我猜你自己没有生成那个字符串。所以问题是,为什么要解析它?这看起来像是你应该退后一步想想你想要解决的问题,以及另一种方法是否可能更清洁的问题。
我ListViewSubItem
对这门课不熟悉,但似乎你有其中之一,你已经调用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;