我正在构建一封电子邮件,并且需要不时删除该电子邮件中的此部分内容,因此我想使用-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'>:&nbsp;
    As a house manager, you have two email addresses.&nbsp; Your secondary email
    address is #EMAIL.&nbsp; 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/

10-11 22:57
查看更多