2017-02-13 67 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

相关问题