首页 > 解决方案 > 检查电子邮件地址是否包含不允许的字符

问题描述

我正在使用 VBA“Asc”函数返回电子邮件地址中每个字符的 ASCII 码。
如果 ASCII 码不在特定范围内,则函数应返回无效(如果不是数字、不是字母、不是“@”、“_”和“.”)字符的位置。
代码永远不会返回正确的结果。

Function FirstNotValid(xStr As String) As Long
    Dim xChar As Integer
    Dim xPos As Integer
    Dim I As Integer
    For I = 1 To Len(xStr)
        xChar = Asc(Mid(xStr, I, 1))
        If xChar < 45 Or (58 < xChar < 64) Or (90 < xChar < 97) Or 122 < xChar Then
            xPos = I
            Exit For
        End If
    Next
    FirstNotValid = xPos
End Function

Sub test()
    Debug.Print FirstNotValid("ab?!an@gmail.com")
End Sub

对于用于调用此函数的示例,它应该返回 3。结果始终为 1。
我知道“?” 字符 ASCII 码是 33,它不应该跳过 if 条件,但它确实跳过了。

标签: vbaascii

解决方案


这是我能想到的另一种方法 - 拆分xStr为字节数组,然后使用 Select 语句过滤一系列“允许的字符”:

Function FirstNotValid(xStr As String) As Long
    Dim i As Long
    Dim charArr() As Byte
    
    charArr = StrConv(xStr, vbFromUnicode)
    
    For i = 0 To UBound(charArr)
        Select Case charArr(i)
            Case 46         '.
            Case 48 To 57   '0-9
            Case 64 To 90   '@ + A-Z
            Case 95         '_
            Case 97 To 122  'a-z
            Case Else   'Any character that falls out of allowed range above
                FirstNotValid = i + 1
                Exit For
        End Select
    Next i
End Function

注意:这在 Mac 上不起作用,vbFromUnicode因为 StrConv 的参数在 Mac 上不可用。


推荐阅读