2017-02-13 68 views
2

我想檢查一個字符串(與InStr?)是否可以找到單個字母和數字的組合。特別地,信只能是:如何在VBA字符串中找到數字組合的字母?

「R」 或 「B」 或 「G」 或 「Y」

雖然號碼可以從1到9

Examples given: 

R1 is legal 
Y6 is legal 
A2 is not legal 
G10 is not legal 

在這種字符串只能找到這個組合的一個實例,並且在開始時它由下劃線「_」標記。也可能發生這種組合無處可尋的情況。

我想避免一系列Or或者一個令人難以置信的長的Select Case這個微不足道的解決方案(它帶來了很多我不需要的計算)。

有沒有什麼辦法在這裏使用自定義變量或通配符?

+2

使用'RegEx',這是適合你的情況 –

+0

關懷詳細一點?我不知道這是什麼 – Noldor130884

+0

你的意思是你有一個像'我有R1和G9以及R101 A2222子串'​​這樣的字符串,並且你想要收到一個包含'R1'和'G9'的集合/數組?或者如果一個字符串包含你的模式,就返回'True' /'False'? –

回答

3

您可以使用正則表達式來得到你正在尋找的價值:

_([YRGB]\d)(?!\d) 

這裏,_會發現一個下劃線,然後([YRGB]\d)將匹配,並從[YRGB]字符類(YR捕獲信,GB)和任何數字(\d)之後沒有跟隨另一個數字((?!\d)是一個否定的超前,如果有一個數字立即在當前位置的右側)。

或用一個單詞邊界(\b,它需要比數字之後一個字母/數字或_其他一個字符)結尾:

_([YRGB]\d)\b 

regex demo。結果是子捕獲到1組

示例VBA代碼:

Sub DemoFn() 
Dim re As RegExp 
Dim s As String, res As String 
Dim colMatch As MatchCollection, objMatch As Match 

s = "blahblahblah_R1.blah" 
Set re = New RegExp 
With re 
    .pattern = "_([YRGB]\d)(?!\d)" 
    .Global = False 
    .MultiLine = False 
End With 

Set colMatch = re.Execute(s) 
For Each objMatch In colMatch 
    res = objMatch.SubMatches.Item(0) 
Next 
Debug.Print res 
End Sub 
+0

像魅力一樣工作,謝謝! – Noldor130884

相關問題