为什么使用Replace函数从PowerShell中的多行字符串中删除空行失败?

goo*_*oly 3 regex powershell replace

我正在加载HTML电子邮件,首先我删除了HTML标签,我将每个 空格替换为空格,并将双空格减少一个空格 - 这是有效的.

但是现在我有很多空行,我无法删除.我已经看到了在读取文件时删除空行的示例,但在删除HTML标记和空格之前,我没有任何空行.

我做:

$m = [IO.File]::ReadAllText("$emailFolder\$fName")
$m = $m -replace "<((?!@).)*?>" # removes all html tag but not adr: <John.Doe@Doe.com>
$m = $m -replace "&nbsp;"," "
$m = $m.Replace('  ',' ').Replace('  ',' ').Replace('  ',' ')
$m = $m.Replace('`r','').Replace('`n`n','`n').Replace('`n`n','`n') # does nothing :(
Run Code Online (Sandbox Code Playgroud)

我尝试了各种版本,没有一个删除空行.任何想法,我怎么能做到这一点?

除此之外,我试图使用正则表达式乘数来连续查找空格并失败.

我做错了什么?

$m = $m.Replace(' +',' ')  # does not work
$m = $m.Replace('\s+',' ') # does not work either
Run Code Online (Sandbox Code Playgroud)

bri*_*ist 13

如果我理解正确,你不想删除所有换行符,只是删除"空"行(除了空格之外的任何行).

考虑这个示例字符串:

$multiLine = "Line 1`r`nLine 2`nLine 3`r`n`r`n  `n `t `r`nLine 7`r`n"
Run Code Online (Sandbox Code Playgroud)

显示时,它将在屏幕上显示如下:

Line 1
Line 2
Line 3



Line 7
Run Code Online (Sandbox Code Playgroud)

第4行实际上是一个空行,只有一个CRLF.第5行是后跟单个LF的空格,第6行是空格,制表符,空格,然后是CRLF.我混合行结尾,因为HTML可能是一团糟; 为任何事做好准备是件好事!

要处理所有这些,你可以像这样做一个替换:

$multiLine -creplace '(?m)^\s*\r?\n',''
Run Code Online (Sandbox Code Playgroud)

这是做什么的?

  1. -creplace(只是区分大小写的版本)-replace(我喜欢明确).
  2. (?m)是一种设置正则表达式模式的内联方法.该m模式代表多线,并且它可以让^$锚的每个行的开始/结束匹配的字符串(而不是串的开始和结束).我认为这是你问题的关键.
  3. 我们使用^匹配每行的开头,然后使用\s包含选项卡的类匹配0或更多的空格.
  4. 我们匹配一个可选的回车符(对于Windows换行符),然后是换行符.我们不需要匹配这些的倍数,因为它^会在整个字符串中捕获它们.

结果输出

Line 1
Line 2
Line 3
Line 7
Run Code Online (Sandbox Code Playgroud)

  • 只是想指出 BSUK 的答复不适用于 OP 提出的问题。briantist 提供的解决方案不适用于 BSUK,因为 BSUK 使用的是字符串数组,而不是像 OP 那样使用具有多行的单个字符串。briantist 提供的解决方案确实适用于具有多行的单个字符串。 (2认同)