在 Powershell Substring(0, IndexOf) 中没有匹配项时返回整个字符串

Returning the whole string when no match in a Powershell Substring(0, IndexOf)

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

我在Select-Object中添加了如下表达式:

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

这在 IndexOf() return 匹配时有效...但是当没有匹配时我的 Select-Object 输出 null.

IndexOf returns null 时,如何将表达式更新为 return 原始字符串?

我同意@mklement0 和@PetSerAl 正则表达式给出了最佳答案。耶!正则表达式来拯救!

编辑: 修复我原来的 post.

按照@Adam 在表达式中使用脚本块的想法,您只需向脚本块添加更多逻辑,以便在使用前先检查索引:

$cleanser = {
    $index = ($_.Body).IndexOf("------");
    if($index -eq -1){
        $index = $_.Body.Length
    };
    ($_.Body).Substring(0, $index)
}

$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}

PetSerAl,一如既往,在问题的评论中提供了关键指针:

使用 PowerShell 的 ,它实现 regex-based 字符串替换 returns 输入字符串 as-is 如果正则表达式没有'匹配:

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

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

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

  • 通过不指定替换操作数,隐含了''(空字符串),这有效地从输入字符串中删除了匹配部分(从技术上讲,返回原始字符串的 copy 并删除了匹配部分)。

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

最终效果是删除任何以 ------ 开头的内容,如果存在