我有一个电子邮件的正文(在代码中的这一点,它只是一个字符串),以及我需要找到的一系列单词。我正试图从一系列单词中获取电子邮件中的一系列单词。例如:
$wordsArray = "foo|bar|regex|powershell"
$emailBody = "This is an email body written into a string, without breaks. foo regex."
从此我希望收到
@("foo", "regex")
案件无关紧要,订单无所谓等。
现在我有这个功能:
function func($emailBody, $wordsArray) {
$matched= @()
$matched+= $emailBody| Select-String $wordsArray -AllMatches | ForEach-Object { $_.Matches.Value }
return $matched | sort -Unique
}
然而,这个功能以惊人的速度增长。我循环播放多封电子邮件,第一次运行时,它是0.05287秒,第30次运行是0.11733秒,第45次运行是1.72352秒,第50次是超过5秒。我必须运行40,000次(并且不断增长)。
任何提示?
答案 0 :(得分:1)
看看这是否加快了这个过程:
Slice
从单词数组中创建一个交替的正则表达式,然后在单词边界处拆分电子邮件正文,在电子邮件中创建一个单词数组,并将其与正则表达式进行匹配。由于您使用$wordsFound = @{}
filter AddWord { $wordsFound[$_]++ }
$wordsArray = @("foo", "bar", "regex", "powershell")
$regex = ‘(?i)^(‘ + (($wordsArray |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
$emailBody = "This is an email, without breaks. foo regex."
$emailBody -split '\W' -match $regex | AddWord
$wordsFound.getenunumerator().Name | sort
作为数组运算符,因此它将充当过滤器,在单个操作中传递与正则表达式匹配的所有单词。
编辑:添加了一个使用哈希表作为流内重复数据删除机制的示例。