从数组中的可能性列表中查找字符串中的所有匹配项

时间:2017-10-31 14:16:06

标签: arrays regex powershell

我有一个电子邮件的正文(在代码中的这一点,它只是一个字符串),以及我需要找到的一系列单词。我正试图从一系列单词中获取电子邮件中的一系列单词。例如:

$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次(并且不断增长)。

任何提示?

1 个答案:

答案 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 作为数组运算符,因此它将充当过滤器,在单个操作中传递与正则表达式匹配的所有单词。

编辑:添加了一个使用哈希表作为流内重复数据删除机制的示例。