我已经保存了(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+)' ) {
由于德国ä,比赛失败。 :(
由于我必须处理英语和德语几个月的事实,我创建了一个哈希,用它的数字替换月份名称然后解析日期 - 所以匹配只是一个问题,解析将是下一个
我需要做什么才能
- 将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" }
不是很好,但至少在匹配和解析日期方面工作。
答案 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}'