修剪两点之间的字符串

时间:2012-07-28 16:56:51

标签: c# .net windows

我有一个字符串如下:

ListViewSubItem: {Debian6/Debian6.vmx }

获得以下输出的最有效方法是什么:

Debian6/Debian6.vmx

4 个答案:

答案 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;