【问题标题】:Regex - Extract email address from a string in PowerShell正则表达式 - 从 PowerShell 中的字符串中提取电子邮件地址
【发布时间】:2018-10-24 19:47:12
【问题描述】:

我想从 PowerShell 中的字符串中解析出电子邮件地址。

例如,给定:

$email = "take this email test@mail.com"
$email2 = "secondmail@mail.com"
$email3 = "thirdmail@mail.com needs extracted"

我会得到:

test@mail.com
secondmail@mail.com
thirdmail@mail.com

所有这些字符串中的域是相同的,它总是一个 username@mail.com 地址。

感谢任何帮助!

【问题讨论】:

标签: regex powershell parsing


【解决方案1】:

您可以使用此正则表达式为您的特定域名提取电子邮件。

\w+@mail.com

只要您的电子邮件中的用户名部分仅包含字母、数字和下划线。否则你可能不得不写这样的字符类,而不是 \w,

[a-zA-Z0-9_.-]+@mail.com

就像你看到的那样,它包含字母、数字、下划线、点、连字符

【讨论】:

    【解决方案2】:

    受此答案启发

    How to validate an email address using a regular expression?

    这个答案

    Powershell: Extract text from a string

    这会有所帮助....

    $email = "take this email test@mail.com"
    $email2 = "secondmail@mail.com"
    $email3 = "thirdmail@mail.com needs extracted"
    $email4 = "fourthmail@mail.com and fifthmail@mail.com and sixthmail@mail.com"
    
    $email_regex = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|`"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*`")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
    
    $extracted = [regex]::match($email, $email_regex).Value
    $extracted
    
    $extracted = [regex]::match($email2, $email_regex).Value
    $extracted
    
    $extracted = [regex]::match($email3, $email_regex).Value
    $extracted
    
    [regex]::matches($email4, $email_regex)|select value
    

    最后一行展示了如何从一个文本中提取更多的电子邮件

    【讨论】:

    • 小心。您在正则表达式中包含一个 " 符号,导致引号中断。使用反勾号 ` 符号应该可以缓解该问题
    • 是的,我有反勾号,因为我很小心 ;-)
    【解决方案3】:

    这是另一种方式:

    $email = "take this email test@mail.com"
    $email2 = "secondmail@mail.com"
    $email3 = "thirdmail@mail.com needs extracted"
    
    $array = @($email,$email2,$email3)
    
    foreach($a in $array){
    
        $split = $a.Split(" ")
        $email = ($split | ? {$_ -match "@"})
    
        $email
    }
    

    【讨论】:

      【解决方案4】:

      这在 PS 中应该很简单;

      # initialize your string and pattern (you can choose your own pattern)
      $message = "I'm a creep.1990_radio@gmail.com, I'm a wierdo_head@gmail.com"
      $pattern = "([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})"
      
      # get all the matches and store it in an array
      $results = ($message | Select-String $pattern -AllMatches).Matches
      
      # iterate over array to act on those items
      foreach ($item in ($results)) { Write-Host $item.Value }
      

      在最后一行,您还可以使用Write-Host $item 查看可用属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-13
        • 2013-04-09
        • 2011-12-15
        • 2016-04-28
        • 2012-02-23
        • 2016-02-24
        • 2017-10-10
        • 1970-01-01
        相关资源
        最近更新 更多