我正在构建一封电子邮件,并且需要不时删除该电子邮件中的此部分内容,因此我想使用-replace从#HOUSESTART到#HOUSEEND进行替换,但无法正常工作。
$ body包含此部分以及整个HTML电子邮件的更多内容:
"<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'><b><u><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:
"Times New Roman";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'>#HOUSESTART<o:p></o:p></span></u></b></p>
<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'><b><u><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:
"Times New Roman";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'>PLEASE
NOTE</span></u></b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:
"Times New Roman";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'>:
As a house manager, you have two email addresses. Your secondary email
address is #EMAIL. The only place you will need to use this email address
is when you are enrolling any device in the Targeted Threat Protection.<span
style='mso-spacerun:yes'> </span><b><span style='background:yellow;mso-highlight:
yellow'>(Only used in manager welcome emails.)</span><o:p></o:p></b></span></p>
<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'><b><span style='mso-ascii-font-family:Calibri;mso-fareast-font-family:
"Times New Roman";mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'>#HOUSEEND</span></b><span
style='mso-ascii-font-family:Calibri;mso-fareast-font-family:"Times New Roman";
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'><o:p></o:p></span></p>
我正在使用此命令尝试删除#HOUSESTART和#HOUSEEND之间的所有内容,但并未删除它。
$body = $body -replace "#HOUSESTART.*#HOUSEEND"," "
任何帮助将不胜感激。
最佳答案
默认情况下,.NET正则表达式中的元字符.
匹配除换行符以外的任何字符。
因此,如果您想让.*
跨多行匹配(即也要匹配换行符),则必须使用,您必须使用内联regex option s
(在正则表达式的最开始处使用(?s)
):
$body = $body -replace '(?s)#HOUSESTART.*#HOUSEEND', ' '
注意:
*我使用的是
'...'
(单引号,即逐字字符串),而不是"..."
(可扩展(插值)字符串),以避免在PowerShell可能先解释什么和正则表达式引擎看到什么之间产生混淆。*
.*
贪婪地匹配,以便匹配输入的#HOUSEEND
的最后一个实例的所有内容;如果可以有多个实例,并且您只想通过下一个实例进行匹配,请使用非贪婪的.*?
请注意,
$body
必须为单行多行字符串,才能正常工作。例如,如果您使用
$body = Get-Content file.txt
之类的东西来设置$body
,您将得到一个字符串数组,每个字符串都应用了-replace
操作,将无法使用。在这种情况下,请使用-Raw
开关确保将文件读取为单行多行字符串:$body = Get-Content -Raw file.txt
。关于powershell - 如何使用Powershell从字符串中删除文本的一部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57861786/