2017-06-05 14 views
1

我正在寫一個VBA函數來評估一個字符串是否是一個有效的全名或不。例如:RegExp測試全名不按預期工作

  • 有效的完整名稱:

大衛·吉爾摩

胡安·穆尼奧斯

克勞迪奧·阿爾貝託·達席爾瓦

  • 富無效LL名稱:

大衛Gilm01ur小

胡安·穆尼奧斯

克勞迪奧阿爾貝託·達席爾瓦

所以我的函數的代碼是這樣的:

Function isVálidoNome(ByVal Texto As String) As Boolean 
isVálidoNome = False 
' 
Dim strPattern As String: strPattern = "(^[a-zA-Z]+(\s?[a-zA-Z])*)*" 
'Dim strPattern As String: strPattern = "\d" 
Dim regularExpressions As New RegExp 
' 
regularExpressions.Pattern = strPattern 
regularExpressions.Global = True 
' 
If (regularExpressions.Test(Texto)) Then 
    isVálidoNome = True 
End If 


End Function 

我使用的模式(^[a-zA-Z]+(\s?[a-zA-Z])*)*在我用來測試它的應用程序(RegexPal)中工作正常,但是當我在VBA中運行代碼時,字符串與數字,重音符號返回true

爲什麼這個問題或者我犯了什麼錯誤?

回答

2

您需要使用

^[a-zA-Z]+(?:\s[a-zA-Z]+)*$ 

regex demo

regularExpressions.Global = False

詳細

  • ^ - 串的開始
  • [a-zA-Z]+ - 1以上ASCII字母
  • (?: - 非捕獲組的開始相匹配的零個或更多(*)序列:
    • \s - 單個空格(添加後+以匹配1個或多個空格)
    • [a-zA-Z]+
  • )* - 端的非捕獲組
  • $的 - 字符串的結尾。
+0

男人,它的工作......但我仍然認識到:當我需要一個正則表達式表達式取決於另一個,我必須使用'(?:',這是問題的原因,對吧? – tdmsoares

+1

'(?:...)'只是一個非*捕獲組。它與捕獲的一樣('(...)'),但不創建'.Submatches'。只需使Match對象的內部結構更清潔即可。 –

+0

對我的問題抱歉,但是捕捉組和非捕捉組之間有什麼區別?我讀過它,但我仍然困惑 – tdmsoares