2015-05-05 61 views
1

我在VBA中編寫了代碼,我試圖將它轉移到Vb.Net,但我不確定我的工作。將Right和Instr轉換爲vb.net子串

VBA代碼(適用於vb.net):

Dim stringDate$ = "something happens: 03/12/2014 11:00" 
    Dim C$ = Trim(Strings.Right(stringDate, Len(stringDate) - InStr(1, stringDate, ":", vbTextCompare))) 

Vb.Net代碼:

Dim C$ = stringDate.substring(stringDate.length - stringDate.indexof(":"), stringDate.length - (stringDate.length -stringDate.indexof(":"))).trim() 

但是更長的代碼似乎並不像一個改進。不是嗎?

什麼是正確的方法?

+1

如果您對'Len'和'Instr'等傳統VB函數感到滿意,那就使用它們。就我個人而言,我不喜歡它們,因爲它們中的很多都涉及到Object的裝箱參數,沒有其他好處。 「更長的代碼」比拳擊更有意義。 – Plutonix

+5

stringDate.Substring(stringDate.IndexOf(「:」)+ 1).Trim()更短,不會彈出。 –

+0

在進行.Net開發時,出於幾個原因,我更喜歡字符串之外的方法。首先,VB版本不是實例方法,所以他們必須檢查傳入的字符串是否爲空。如果你已經知道你的字符串不爲空,這可能是很多不必要的檢查。更關心的問題是像InStr這樣的方法使用單基索引而不是零基索引。這對於零基礎的.Net字符串函數來說效果不佳。許多開發人員也不期望得到一個基礎的結果。 – Scott

回答

1

我覺得用正則表達式是從中提取字符串的日期,因爲你可能每次都使用不同的字符串,例如最好的辦法:

Dim stringDate = "something happens: 03/12/2014 11:00" 
Dim stringDate = "something 03/12/2014 11:00" 
Dim stringDate = "something happens:::>> 03/12/2014 11:00" 

用下面的代碼,你可以從提取的日期所有這些字符串:

Dim m As Match = New Regex("\d{2}/\d{2}/\d{4} \d{2}:\d{2}").Match(stringDate) 
If m.Success Then 
    MsgBox(m.Value) 
End If 

但是,如果你不關心「日期」,只是詢問RightInstr然後Substring將是一個很好的解決方案,並使用它的方式是取決於你輸入的字符串。

+0

是否可以使用正則表達式(無if ... else)來區分「Happy Xmas:25/12/2014」和「Happy Xmas:25/12/2014 10: 04「這樣提取日期或日期和時間?如果「If ... else」是必要的,我認爲它會更容易使用子字符串。 – genespos

+0

不,不需要使用「if .. else」,您可以檢查多種日期格式,只需使用管道'|'分隔不同的模式,例如:\ d {2}/\ d {2 }/\ d {4} \ d {2}:\ d {2} | \ d {2}/\ d {2}/\ d {4}',此模式將提取「date」和「約會時間」。 – Muhammad

+0

太棒了!謝謝。只有最後一個問題:獲得的字符串格式爲''dd/mm/yyyy hh:mm'',但我需要格式爲''yyyy-mm-dd hh:mm「'但是'.ToString(」yyyy-MM -dd hh:mm「)'似乎不工作......任何想法? – genespos