我不断收到第一个匹配电子邮件的 "true" 语句,其余都是 "False"

I keep getting "true" statement for the first match of email and the rest all are "False"

我目前正在做一个程序,可以检测文本文件中的电子邮件,我可以提取电子邮件,但无法验证电子邮件。验证码是这样的:

    Dim truelist As New ArrayList
    For i As Integer = 0 To ListBox2.Items.Count - 1
           truelist.Add(ListBox2.Items(i))
    Next
    For Each item In truelist
        Dim result As Boolean
        Dim rgx As New Regex("^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)(.[a-z]{2,4})$")

        If rgx.IsMatch(item) Then
            MessageBox.Show(item, "true")
            result = True

        Else
            MessageBox.Show(item, "false")
            result = False

        End If
    Next

我的示例输入是:

  1. ys_host@hotmail.com
  2. .kjdsd.@hotmail.com
  3. .as.das.@hotmail.com
  4. ~!U#)(!#U@hotmail.com
  5. idgohwoijgw12942149!@hotmail.com
  6. ys_host@hotmail.com

即使我的第一个输入与上一个输入相同,但我会从上一个输入中得到 false return

您的正则表达式不考虑任何 space,并评估从输入开始 (^) 到结束 ($) 的字符。因此,输入字符串中的任何前导或尾随 space 将无法匹配。

Trim() 是删除字符串末尾或开头的 space 的 VB 命令。 LTrimRTrim 是删除两端的 space 的特定命令。资料来源:https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.strings.trim(v=vs.110).aspx; while https://docs.microsoft.com/en-us/dotnet/standard/base-types/trimming 表示 String.Trim() 一般适用于白色 space。

您可以 Trim() 输入您的 ListBox,这应该可以解决问题。在这种情况下,更安全和更好的方法是 Trim() 正则表达式的输入 - 在代码中最有效的时间进行数据验证。示例代码(基于您的代码)为:

Dim truelist As New ArrayList
For i As Integer = 0 To ListBox2.Items.Count - 1
       truelist.Add(Trim(ListBox2.Items(i))) '*** Changed this line, added "Trim"
Next
For Each item In truelist
    Dim result As Boolean
    Dim rgx As New Regex("^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)(.[a-z]{2,4})$")
    If rgx.IsMatch(item) Then
        MessageBox.Show(item, "true")
        result = True
    Else
        MessageBox.Show(item, "false")
        result = False
    End If
Next

替代语法是truelist.Add(ListBox2.Items(i).Trim())

顺便说一句,这段代码在函数中的设置已经成熟 - 允许重用。这是重构的示例:

'[Main function elements ... Include Sub/Function header etc.]
Dim truelist As New ArrayList
For i As Integer = 0 To ListBox2.Items.Count - 1
       truelist.Add(Trim(ListBox2.Items(i))) '*** Changed this line, added "Trim"
Next
For Each item In truelist
    Dim result As Boolean
    If IsValidEmailAddress(item) Then
        ' Do valid stuff
    Else
        ' Do not-valid stuff
    End If
Next

'[Main Sub/Function tail, include End Sub/Function as relevant]

Function IsValidEmailAddress(value as String) as Boolean
    Dim rgx As New Regex("^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)(.[a-z]{2,4})$")
    return rgx.IsMatch(item.Trim()) ' Note use of Trim here for encapsulated data validation.
    ' encapsulated data validation may or may not be what you want.
End Function