在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串
我有一些Powershell可以处理Outlook文件夹中的邮件。大多数电子邮件都有一个页脚,以文本开头。我想转储此字符串之后的所有文本 我在在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串,powershell,powershell-5.0,Powershell,Powershell 5.0,我有一些Powershell可以处理Outlook文件夹中的邮件。大多数电子邮件都有一个页脚,以文本开头。我想转储此字符串之后的所有文本 我在Select Object中添加了一个表达式,如下所示: $cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))} $someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser} 当Index
Select Object
中添加了一个表达式,如下所示:
$cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}
当IndexOf()
返回一个匹配项时,此选项就起作用了。。。但是当没有匹配时,我的选择对象
输出null
当
IndexOf
返回null
时,如何更新表达式以返回原始字符串?我同意@mklement0和@PetSerAl正则表达式给出了最佳答案。耶!正则表达式拯救一切
编辑:
修复我原来的帖子
按照@Adam在表达式中使用脚本块的想法,您只需向脚本块添加更多逻辑,以便在使用之前先检查索引:
$cleanser = {
$index = ($_.Body).IndexOf("------");
if($index -eq -1){
$index = $_.Body.Length
};
($_.Body).Substring(0, $index)
}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}
与之前无数次一样,在对该问题的评论中提供了关键指针:
使用PowerShell,它实现基于正则表达式的字符串替换,在正则表达式不匹配时按原样返回输入字符串:
# The script block to use in a calculated property with Select-Object later.
$cleanser = { $_.Body -replace '(?s)------.*' }
如果要确保------
仅在行首匹配,请使用(?sm)^-----.
;如果还要删除前面的换行符,请使用(?s)\r?\n----------.
是一个内联正则表达式选项,它使(?s)
也匹配换行符,以便
有效地跨行匹配所有剩余文本*
- 通过不指定替换操作数,隐含了
(空字符串),这将有效地从输入字符串中删除匹配部分(从技术上讲,将返回删除匹配部分的原始字符串的副本)'
- 如果regex
不匹配,'(?s)--.*
按原样返回(从技术上讲,返回的是输入字符串本身,而不是副本)$\ Body
净效果是以
----
开头的任何内容都会被删除,如果存在的话。($.Body)-替换'(?)---.'
@MathiasR.Jessen,问题不在于$.Body
不是一个字符串-HAL9256解决的问题是只调用了一次$.Body.IndexOf(“----”
),在用作计算属性一部分的$cleaner
脚本块之外。谢谢。我更喜欢不太冗长的答案,而且我怀疑(尽管还没有测试过)它可能也更有效。不管怎样,谢谢:-)很高兴听到这很有帮助,@Adam;我的荣幸。