在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串

时间:2019-07-13 16:45:52

标签: powershell powershell-5.0

我有一些Powershell,可以处理Outlook文件夹中的邮件。大多数电子邮件的页脚都以文本"------"开头。我想在此字符串之后转储所有文本。

我已向Select-Object添加了一个表达式,如下所示:

$cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}

这在IndexOf()返回匹配项时起作用...但是在没有匹配项时,我的Select-Object输出null

IndexOf返回null时,如何更新表达式以返回原始字符串?

2 个答案:

答案 0 :(得分:3)

我同意@ 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}

答案 1 :(得分:3)

PetSerAl就像以前无数次一样,已经在对该问题的评论中提供了关键的指针:

使用PowerShell的-replace operator,该工具实现基于正则表达式的字符串替换,如果正则表达式不匹配,则按原样返回输入字符串

# The script block to use in a calculated property with Select-Object later.
$cleanser = { $_.Body -replace '(?s)------.*' }

如果要确保------仅在一行的开始处匹配,请使用(?sm)^------.*;如果您还想删除前面的换行符,请使用(?s)\r?\n------.*

  • (?s)是一个内联正则表达式选项,它也使.匹配换行符,以便.*有效地匹配所有剩余的文本。

  • 由于未指定替换操作数,因此暗示''(空字符串),从而有效地从输入字符串(技术上称为复制原始字符串并删除匹配部分)。

  • 如果正则表达式'(?s)------.*'不匹配匹配,则$_.Body将按原样返回(从技术上讲,返回的是输入字符串本身,而不是副本) )。

最终结果是,删除所有以------开头的内容,如果存在的话