Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组中的可能性列表中查找字符串中的所有匹配项_Arrays_Regex_Powershell - Fatal编程技术网

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

Arrays 从数组中的可能性列表中查找字符串中的所有匹配项,arrays,regex,powershell,Arrays,Regex,Powershell,我有一封电子邮件的正文(在代码的这一点上,它只是一个字符串),还有一个我需要查找的单词数组。我正在尝试从单词数组中获取电子邮件中的单词数组。例如: $wordsArray = "foo|bar|regex|powershell" $emailBody = "This is an email body written into a string, without breaks. foo regex." 我希望从中得到 @("foo", "regex") 案件不重要,顺序不重要,等等 现在我有这

我有一封电子邮件的正文(在代码的这一点上,它只是一个字符串),还有一个我需要查找的单词数组。我正在尝试从单词数组中获取电子邮件中的单词数组。例如:

$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秒以上。我必须运行这个40000次(并且不断增长)


有什么提示吗?

看看这是否会加快流程:

$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
这将从单词数组中创建一个交替正则表达式,然后在单词边界处拆分电子邮件正文,在电子邮件中创建一个单词数组,并将其与正则表达式匹配。由于您将
-match
用作数组运算符,因此它将充当过滤器,在单个操作中通过与正则表达式匹配的所有单词


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

能否包含其余代码?我不明白为什么您发布的函数的运行时间在多次使用时会增加。@ctwheels我没有与任何webmail对象进行交互,在脚本的这一点上,它是一个原始字符串。你可以完全用“随机字符串”替换“电子邮件”,我也会有同样的问题。@AxelPersinger将这些信息添加到你的问题中,以防止进一步的混淆。它将时间缩短了一半,但它仍然呈指数级增长。这对我来说毫无意义,但如果没有与之相匹配的体型增长,它肯定会增长。你的记忆消耗是什么样子的?在你进行重复数据消除之前,你是否在收集所有邮件中的所有单词?若那个数组越来越大,那个么它可能会在内存管理方面耗尽你们的精力,你们可能会停止使用哈希表在流中对它们进行重复数据消除。我将用一个例子来更新答案。电子邮件字符串实际上来自一个SharePoint对象列表,该列表将非常大,我只是将字符串传递给这个函数。我监测了mem消耗量,没有发现任何重大峰值或其他情况。不幸的是,我尝试了你的编辑,但似乎没有任何改进@Mjolinor关于这一点,我唯一的建议是开始在流程的各个点添加一些度量命令行,看看它们是否会告诉您瓶颈在哪里发展。