0

我有一个字符串如下:

ListViewSubItem: {Debian6/Debian6.vmx }

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

Debian6/Debian6.vmx
4

4 回答 4

1
int beginidx = haystack.IndexOf('{');
string needle = haystack.SubString(beginidx,
                                   haystack.IndexOf('}') - beginidx + 1).Trim();
于 2012-07-28T17:01:33.953 回答
0

您可以使用正则表达式:

\{\s*(.*)\s*\}

所需的字符串将位于第一个捕获的组 ( Match.Groups[1]) 中。

例子:

string output = Regex.Match(input, @"\{\s*(.*?)\s*\}").Groups[1].Value;

正如所指出的,正则表达式比普通字符串操作慢。如果性能是一个问题,并且字符串提取处于紧密循环中,那么使用优化的方法可能会更好。否则,正则表达式与字符串在恕我直言是个人喜好问题。

于 2012-07-28T17:00:37.320 回答
0

string result = Regex.Match("ListViewSubItem: {Debian6/Debian6.vmx }", @"(?<={)(.+?)(?=})").Value;

于 2012-07-28T17:03:29.060 回答
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;
于 2012-07-28T17:34:25.423 回答