Vb.net 我不断地得到;“真的”;电子邮件第一次匹配的声明和其他所有声明均为;假;

Vb.net 我不断地得到;“真的”;电子邮件第一次匹配的声明和其他所有声明均为;假;,vb.net,validation,email-validation,Vb.net,Validation,Email Validation,我目前正在做一个程序,将检测文本文件中的电子邮件,我能够拿出电子邮件,但无法验证电子邮件。验证代码如下所示: 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 Bool

我目前正在做一个程序,将检测文本文件中的电子邮件,我能够拿出电子邮件,但无法验证电子邮件。验证代码如下所示:

    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
我的示例输入是:

  • ys_host@hotmail.com
  • .kjdsd.@hotmail.com
  • .as.das.@hotmail.com
  • ~!U#)(U#))(U#)(U#))#U@hotmail.com
  • idgohwoijgw12942149!@hotmail.com
  • ys_host@hotmail.com

  • 即使我的第一次输入与最后一次输入相同,但我将从最后一次输入中获得假返回值

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

    Trim()
    是一个VB命令,用于删除字符串末尾或开头的空格。
    LTrim
    RTrim
    是删除任意一端空格的特定命令。源:;而表示
    String.Trim()
    通常适用于空格

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

    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
    

    您还可以添加一些示例输入数据吗?否则我们将永远无法猜测是什么数据导致了您的问题。@JayV我已经更新了输入,谢谢您的建议。无法复制。唯一有效的匹配是第一个和最后一个,并且都经过验证。您是否已修剪输入以确保没有前导空格或尾随空格?
    Trim(ListBox2.Items(i))
    @AJD谢谢!它确实有效!非常感谢