在 PowerShell 中的每个正则表达式匹配实例之后附加字符

Append character after each instance of a regex match in PowerShell

我想知道是否可以将一个字符(稍后用作定界符)附加到字符串中正则表达式匹配的每个实例。

我正在为 < > 之间的字符串解析文本,并且有一个有效的正则表达式模式——尽管这会折叠匹配的每个实例。

我想做的是在匹配的每个实例后附加一个 ,这样我可以稍后调用 .split(',') 方法并获得一个可以循环的字符串集合。

$testString = "<blah@gmail.com><blah1@gmail.com>"
$testpattern = [regex]::Match($testString, '(?<=<)(.*)(?=>)').Value

$testPattern 现在将是 "blah@gmail.combblah1@gmail.com"

我想要的是在匹配的每个实例之间添加一个分隔符,以便在事后调用 .split() 方法来处理集合。

$testpatternblah@gmail.com><blah1@gmail.com

您应该使用 <(.*)><(.*)> 保留两个电子邮件地址,然后连接两个字符串:$testpattern = $testpattern[0] + "your string you want inbetween" + $testpattern[1]

不确定 0 和 1,取决于语言。

还有一点,小心,如果电子邮件中有一些空格或无效字符,它仍然会捕获它们。你应该使用 <([a-zA-Z0-9\-@\._]*\@[a-zA-Z0-9-]*\.[a-z-A-Z]*)><([a-zA-Z0-9\-@\._]*\@[a-zA-Z0-9-]*\.[a-z-A-Z]*)>

我知道这不是解决上述问题的唯一方法,而且绝对不是最有效的方法 -- 但我最终做了以下事情。

所以为了重申这个问题,我需要解析电子邮件 headers(到行),获取所有 smtp 地址(值在“<”和“>”之间),并将所有地址存储在collection事后

        $EMLToCol = @()

        $parseMe = $CDOMessage.to
        # select just '<emailAddress>'
        $parsed = Select-String -Pattern '(<.*?>)+' -InputObject $parseMe -AllMatches | ForEach-Object { $_.matches }
        # remove this guy '<', and this guy '>'
        $parsed = $parsed.Value | ForEach-Object {$_ -replace '<' -replace '>'}
        # add to EMLToCol array
        $parsed | ForEach-Object {$EMLToCol += $_}