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