vba - 检查电子邮件地址是否包含不允许的字符
问题描述
我正在使用 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 条件,但它确实跳过了。
解决方案
这是我能想到的另一种方法 - 拆分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 上不可用。
推荐阅读
- pandas - 根据 pandas 数据框中的条件将 value_counts 与 groupby 函数一起使用并插入新列
- arduino - 用milis arduino闪烁WS2812 fastLED
- azure - 有没有办法在 Azure 存储 Blob 容器中为每个 Blob(文件)添加 ACL?
- verilog - Verilog中的Reg数据类型
- ngx-admin - 手风琴组件标题中的操作
- django - 移植和现有的嵌套集层次结构
- laravel - 如何为 Laravel Lighthouse 中的突变定义多态的一对多关系?
- python - Python Selenium 多线程处理不同的 Chrome 实例
- java - Java UTF-8 格式错误的测试用例是对的吗?
- ios - 更改数组中的值