在 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 '<([^<>]*)>','$1;'
嗨,Mathias,感谢您的回复——该模式确实有效……但是,我需要做的是匹配并附加内联。我遇到的问题是,当我匹配电子邮件地址的模式时,所有地址都连接起来,没有我可以用来进一步解析的分隔符。
【参考方案1】:
$testpattern
是blah@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]*)>
【讨论】:
【参考方案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 中的正则表达式匹配的每个实例之后附加字符的主要内容,如果未能解决你的问题,请参考以下文章