在 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(从技术上讲,它是输入返回的字符串本身,而不是副本)。
最终效果是删除任何以 ------
开头的内容,如果存在。
我有一些 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 的
# 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(从技术上讲,它是输入返回的字符串本身,而不是副本)。
最终效果是删除任何以 ------
开头的内容,如果存在。