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

Posted

技术标签:

【中文标题】在 PowerShell 中的正则表达式匹配的每个实例之后附加字符【英文标题】:Append character after each instance of a regex match in PowerShell 【发布时间】:2017-05-14 08:09:34 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

$testString -replace '&lt;([^&lt;&gt;]*)&gt;','$1;' 嗨,Mathias,感谢您的回复——该模式确实有效……但是,我需要做的是匹配并附加内联。我遇到的问题是,当我匹配电子邮件地址的模式时,所有地址都连接起来,没有我可以用来进一步解析的分隔符。 【参考方案1】:

$testpatternblah@gmail.com&gt;&lt;blah1@gmail.com

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

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

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

【讨论】:

【参考方案2】:

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

所以要重申这个问题,我需要解析所有 smtp 地址('' 之间的值)的电子邮件标题(到行),并在事后将所有地址存储在一个集合中。

        $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 += $_

【讨论】:

以上是关于在 PowerShell 中的正则表达式匹配的每个实例之后附加字符的主要内容,如果未能解决你的问题,请参考以下文章

powershell中的正则表达式

在PowerShell中组合两个正则表达式

我可以使一个正则表达式完全匹配一个类中的每个字符 - 即使字符在类中重复?

在powershell中获取文件名中正则表达式的索引

如何使用正则表达式,将字符串中的每个单词首字母大写

如何计算 AIX 上每个文件的正则表达式匹配总数