2012-07-28 86 views
0

我有一個字符串,如下所示:修剪串

ListViewSubItem: {Debian6/Debian6.vmx } 

什麼會得到以下輸出的最有效的方法:

Debian6/Debian6.vmx 
+2

是效率的大問題?或者它只是一個'很高興有'? – 2012-07-28 17:07:49

+1

效率最高的是:子串(18,19) – 2012-07-28 17:52:07

+0

顯示你的**不夠**的方式。我們可以嘗試改進它。 – 2012-07-28 20:53:10

回答

1
int beginidx = haystack.IndexOf('{'); 
string needle = haystack.SubString(beginidx, 
            haystack.IndexOf('}') - beginidx + 1).Trim(); 
+0

改爲'乾草堆。IndextOf('{')'和'haystack.IndexOf('}',beginidx + 1)',這將是毫無疑問的最佳解決方案。 – SimpleVar 2012-07-28 17:07:08

+1

@YoryeNathan我的第一個答案使用雙引號作爲參數,但更改爲單引號(無編譯器),感謝編輯。 – xandercoded 2012-07-28 17:11:29

0

您可以使用正則表達式:

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

所需的字符串將在第一個捕獲的組中(Match.Groups[1])。

實施例:

​​

正如所指出的,正則表達式是比普通字符串操作速度較慢。如果性能問題,並且字符串提取處於緊密的循環中,那麼使用優化的方法可能會更好。否則,正則表達式與字符串是恕我直言的個人喜好的問題。

+0

正則表達式不會*效率最高* – SimpleVar 2012-07-28 17:03:38

+0

它不會比字符串操作方法效率低很多。 – 2012-07-28 17:04:41

+0

1.會的。 2.「大多數」的意思是「最」,而不是「或多或少」。 – SimpleVar 2012-07-28 17:05:19

0

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

+1

正則表達式不會最高效 – SimpleVar 2012-07-28 17:03:49

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;