从vb.net中的字符串解析电子邮件地址

时间:2017-06-21 08:33:11

标签: vb.net parsing formatting

希望有人可以帮我解决这个问题。

我已经从交换中导出了大量的分发列表导出。

出口看起来像这样...... enter image description here

我正在编写一个小应用程序来解析这些并吐出一个脚本,可以将其直接转储到交换shell中以重新创建列表。

到目前为止,我已经阅读了输出并逐行循环播放。

我想要做的是找到行中@符号的位置然后抓住它前面的所有内容,直到遇到一个空格,然后一切都在它之后,直到遇到一个空格。

我已经在excel中做了一百万次这样的事情,但从来没有在vb.net中,我不知道如何实现它。

对不起,如果这看起来像一个愚蠢的问题;如果你知道答案,它们就很容易了。

到目前为止,我有这个(谢谢Pikoh!)......

If System.IO.File.Exists(strFileName) = True Then

    Dim objReader As New System.IO.StreamReader(strFileName)

    Do While objReader.Peek() <> -1

        TextLine = TextLine & objReader.ReadLine() & vbNewLine

    Loop

    output.Text = TextLine


    For Each line As String In output.Text.Split(vbLf)
        Try
            Dim testStrings As String() = New String() {line}
            Dim stringSeparators() As String = {" ", "\t"}
            Dim email1 = testStrings(0).Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries)(1)
            Dim email2 = testStrings(0).Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries)(1)


            MessageBox.Show(email1 & "|" & email2)
        Catch ex As Exception
            MessageBox.Show("Nothing :(")
        End Try


    Next

End If

2 个答案:

答案 0 :(得分:1)

在这种简单的情况下,我认为最简单的方法就是使用Split。由于我不知道2列之间的内容,我将定义2个分隔符:空格和制表符:

Dim testStrings As String() = New String() {"test     test@domain.com", "test2" & vbTab & "test2@domain.com"}
Dim stringSeparators() As String = {" ", vbTab}
Dim email1 = testStrings(0).Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries).Last()
Dim email2 = testStrings(0).Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries).Last()

答案 1 :(得分:0)

你仍然可以用同样的方式做到这一点。实际上,您的VBA代码可能在VB.NET中有效。

使用以下测试文件:

Name                      PrimarySmtpAddress
----                      ------------------
_Sys.User                 sys.user@domain.com     
Joe Bloggs                joe.bloggs@domain.com 
Bill Gates                bill.gates@domain.com 
J. Someone Else              someone.else@domain.com 
Matt "M@tty" Pain         matt@example.com

和代码

Option Infer On
Option Strict On

Imports System.IO

Module Module1

    Function ExtractEmailAddress(s As String) As String
        Dim atPos = s.LastIndexOf("@"c)
        If atPos < 0 Then
            Return String.Empty
        End If

        Dim firstPos = atPos + 1
        Dim lastPos = atPos - 1

        Do
            firstPos -= 1
        Loop Until firstPos = 0 OrElse String.IsNullOrWhiteSpace(s.Chars(firstPos))

        Do
            lastPos += 1
        Loop Until lastPos = s.Length OrElse String.IsNullOrWhiteSpace(s.Chars(lastPos))

        Return s.Substring(firstPos + 1, lastPos - firstPos - 1)

    End Function

    Sub Main()
        Using sr As New StreamReader("C:\temp\ExampleOutput.txt")
            While Not sr.EndOfStream
                Dim line = sr.ReadLine()
                Dim email = ExtractEmailAddress(line)
                If email.Length > 0 Then
                    Console.WriteLine(email)
                End If

            End While
        End Using

        Console.ReadLine()

    End Sub

End Module

输出是:

  

sys.user@domain.com
  joe.bloggs@domain.com
  bill.gates@domain.com
  someone.else@domain.com
  matt@example.com