我无法强制PowerShell正确编码已保存的电子邮件

时间:2014-08-02 13:02:37

标签: regex email powershell encoding

我已经保存了(Thunderbird)大约2000封我想要分析的电子邮件 所以我创建了一个循环通过所有电子邮件将它们逐个读入一个变量:

   #several tries to read the email - they all fail
   #$mail = [IO.File]::ReadAllText(".\$($_.Value)", System.Text.Encoding.Unicode) #ERROR
   #$mail = [IO.File]::ReadAllText(".\$($_.Value)")  # match fails
   $mail = (Get-Content -Encoding UTF8 ".\$($_.Value)") # match fails too
   $mail = $mail.Replace('ä','ae') # no error, no replacement :(

然后我首先想要匹配几个德国日期,如:“Montag,den2.März2009”(= 2009年3月2日星期一)

   #                    Montag               2          M        ärz       2009
   if ( $mail -match '.+[MDF][a-z]+.+?den.*?(\d+).*?([JFMAJSOND][a-z]+).*?(\d+)' ) {

由于德国ä,比赛失败。 :(

  • 我尝试了各种版本加载文件(s.a.)。
  • 我尝试了$ mail.Replace(“ä”,“ae”)并得到错误无替换。
  • 我试图在比赛模式中输入ä[äa-z] +并且失败了
  • 我将电子邮件加载到记事本中,ä正确显示,编码为Ansi
  • 如果我打印$ email到控制台,'März'(和其他öüß)转换为:'M rz'

由于我必须处理英语和德语几个月的事实,我创建了一个哈希,用它的数字替换月份名称然后解析日期 - 所以匹配只是一个问题,解析将是下一个

我需要做什么才能 - 将März转换为Maerz或
- 正确匹配März或
- 阅读具有正确编码的电子邮件 为了顺利匹配和解析:

    $h = @{März = 3; Maerz = 3}
    $date = "Montag, den 2. März 2009"
    if ( $date -match 'den.+?(\d+).*?([JFMASOND][a-zäöü]+).*?(\d+)' ) {
        $tmp = "$($Matches[1]) $($h.$($Matches[2])) $($Matches[3])"
        try{
           $day = [datetime]::ParseExact( $tmp, "d M yyyy", $null)
        } catch { Write-Host "Error Parse" $tmp}
    } else { Write-Host "Error match" }

提前致谢

找到一个奇怪的解决方案:

    $mail = [IO.File]::ReadAllText(".\$($_.Value)")
    ...
    $h = @{März = 3; Maerz = 3; 'M�rz' = 3}
    $date = "Montag, den 2. März 2009"
    if ( $date -match 'den.+?(\d+).*?([JFMASOND][a-z�]+).*?(\d+)' ) {
        $tmp = "$($Matches[1]) $($h.$($Matches[2])) $($Matches[3])"
        try{
           $day = [datetime]::ParseExact( $tmp, "d M yyyy", $null)
        } catch { Write-Host "Error Parse" $tmp}
    } else { Write-Host "Error match" }

不是很好,但至少在匹配和解析日期方面工作。

1 个答案:

答案 0 :(得分:1)

匹配德国ä使用:

\p{L}

这将匹配所有Unicode字母。 (大小写)


此正则表达式匹配:Montag,den2.März2009

.*[MDF][a-z]+.+?den.*?(\d+).*?([JFMAJSOND][\p{L}]+).*?(\d+)

这应该符合您上面提到的格式的一些德国日期,如:Montag,den2.März2009

(?:Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag),\s+den\s+\d+\.\s+(?:Jannuar|J(?:ä|ä)nner|Februar|Feber|M(?:ä|ä)rz|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember)\s+\d{4}

这适用于我的Powershell:

$test = "Montag, den 2. März 2009"
$test -match '(?:Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag),\s+den\s+\d+\.\s+(?:Jannuar|J(?:ä|ä)nner|Februar|Feber|M(?:ä|ä)rz|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember)\s+\d{4}'