如何分割包含换行符的字符串

时间:2020-07-11 16:37:09

标签: powershell newline line-breaks

一个字符串(从Outlook电子邮件的body.innerText中提取)包含嵌入的换行符。如何将其拆分为字符串数组?

我希望将示例字符串拆分为两(2)个项目的数组。取而代之的是,它变成一个由三(3)个项目组成的数组,中间有一个空白行。

PS C:\src\t> ("This is`r`na string.".Split([Environment]::NewLine)) | % { $_ }
This is

a string.
PS C:\src\t> "This is `r`na string.".Split([Environment]::NewLine) | Out-String | Format-Hex

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   54 68 69 73 20 69 73 20 0D 0A 0D 0A 61 20 73 74  This is ....a st
00000010   72 69 6E 67 2E 0D 0A                             ring...

3 个答案:

答案 0 :(得分:3)

要将CRLF序列作为一个整体作为分隔符,使用-split operator (即 regex )更简单基于>:

PS> "This is `r`n`r`n a string." -split '\r?\n'
This is 
 a string.

注意:

  • \r?\n匹配CRLF(Windows风格)和仅LF(Unix风格)换行符;如果您确实只想匹配CRLF序列,请使用\r\n

    • 请注意使用单引号字符串('...'),以便将包含正则表达式的字符串原样传递给.NET正则表达式引擎;正则表达式引擎使用\作为转义字符;因此使用\r\n
  • PowerShell的-split operator 通常是[string] .NET类型的.Split() 方法的替代品-请参见this answer


关于您尝试过的事情

在Windows上,分隔符参数[Environment]::NewLine是字符串"`r`n",即CRLF序列。

  • PowerShell [Core] v6 + 中,您的命令起作用,因为该字符串作为一个整体被视为分隔符。

  • 史蒂文(Steven)在his helpful answer中指出,在 Windows PowerShell 中,
  • 单个字符-CR和LF 被认为是分隔符,从而在结果数组中产生一个额外的空元素-CR和LF之间的空字符串。

此行为更改发生在PowerShell的控制范围之外:.NET Core引入了一个新的.Split()方法重载和一个[string]类型的分隔符参数,PowerShell的重载分辨率算法现在可以选择旧的重载使用[char[]]类型的参数。
避免这种不可避免的(尽管很少见的)无意的行为更改是另一个优先选择PowerShell本机-split operator 而不是.NET [string]类型的.Split() 方法

答案 1 :(得分:3)

这是因为.Split()方法将拆分其找到的任何字符,例如:

"first part of a string-*second part of a string".Split("-*")

输出:

first part of a string

second part of a string

额外元素是在两个分割字符之间插入的空字符串。

(信用@ mklement0,以纠正该问题)

所以我只能假设这是几个因素造成的。前[Environment]::NewLine都是两个字符,分别是CarrigeReturn和LineFeed,来自Outlook的行的确使用该行结束序列。所有这些都将在Windows中实现。

我可以想到两种解决方案:

选项1:

.Split([Environment]::NewLine), [Stringsplitoptions]::RemoveEmptyEntries)

这显然会坚持使用相同的.Split()方法,但是添加的参数将杀死多余的元素。

选项2:

使用PowerShell -split运算符,该运算符使用RegEx匹配分割定界符:

"This is`r`na string." -split "`r`n"

答案 2 :(得分:0)

你好

我在PowerShell中是一个很大的NooB,但是...
我写了这个

$str_1 ="This is

a string."
$splt_1=$str_1.Split()
$cnt_1=1
foreach ($item in $splt_1) {
     $regEx="[a-zA-Z]"
     if ($item -cmatch $regEx){
          $Result_1=$Result_1+"$item "
     } elseif ($cnt_1 -eq 1) {
          $Result_1=$Result_1+"| "
          $cnt_1=$cnt_1+1
     }
}
Write-Host $Result_1
## OUTPUT ##
# This is | a string.

$str_2="
This is

....a st

ring...
"
$splt_2=$str_2.Split()
$cnt_2=1
foreach ($item in $splt_2) {
     $regEx="[a-zA-Z]"
     if ($item -cmatch $regEx){
          $cnt_2=1
          $Result_2=$Result_2+"$item "
     } elseif ($cnt_2 -eq 1) {
          $Result_2=$Result_2+"| "
          $cnt_2=$cnt_2+1
     }
}
Write-Host $Result_2
## OUTPUT ##
# | This is | ....a st | ring... |

希望对您有帮助...

PS:

我只是意识到我忘记了结果.....


$Result_1.Split("|")
## OUTPUT ##
This is
 a string.

 $Result_2.Split("|")
 ## OUTPUT ##
 This is
 ....a st
 ring...

EOF

AxelEric。