一个字符串(从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...
答案 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 + 中,您的命令起作用,因为该字符串作为一个整体被视为分隔符。
单个字符-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。