PowerShell如何在第一次出现子字符串/字符时拆分字符串?

22
我有一个字符串,想要将它分成两个部分。第一部分是逗号(,)之前的内容,第二部分则包括逗号后面所有的内容(包括逗号)。
我已经成功将第一个逗号前的部分存入变量$Header中,但不知道如何将其后面的部分作为一个整体存入新的字符串中。
$string = "Header text,Text 1,Text 2,Text 3,Text 4,"

$header = $string.Split(',')[0] # $Header = "Header text"

$content = "Text 1,Text 2,Text 3,Text 4," 
# There might be more text then visible here, like say Text 5, Text 6, ..
4个回答

43

PowerShell的-split运算符支持指定最大返回的子字符串数量,即要返回多少个子字符串。在用于分割的模式后面,给出您想要返回的字符串数:

$header,$content = "Header text,Text 1,Text 2,Text 3,Text 4," -split ',',2

谢谢Aaron,这就是我现在使用的,你可以在我8月19日13:09的“评论”中看到。 - DarkLite1
1
@DarkLite 哎呀,我没看到那个。 - Aaron Jensen
没问题,任何帮助都是受欢迎的。 - DarkLite1
非常感谢 @AaronJensen 的提示,太完美了。 - Thom Schumacher
1
请注意,如果您要按“。”拆分,则需要添加“\”。 $header,$content =“标题文本。文本1。文本2。文本3。文本4。”-split '\。',2 - Aftab

3

尝试以下内容:

$Content=$String.Split([string[]]"$Header,", [StringSplitOptions]"None")[1]

当你按照字符串分割时,你使用的是函数split的不同签名。

基本用法只需要1个参数,即分隔符字符(有关更多信息可以在此处找到这里)。但是,要使用字符串,则签名如下:

System.String[] Split(String[] separator, StringSplitOptions options)

这就是为什么你必须将字符串转换为字符串数组。在这种情况下,我们使用None选项,但您可以在split文档中找到其他可用选项。
最后,由于$Header的值位于$String的开头,您需要捕获结果数组的第二个成员。

感谢您的帮助Ploutox,我尝试了您上面提供的建议,但是变量“$Content”仍然为空。非常奇怪... - DarkLite1
@DarkLite1 抱歉在发布之前我没有尝试我的答案。使用字符串进行分割与使用字符进行分割有些不同。我会相应地编辑我的答案。 - Aserre
2
谢谢,与此同时我在微软的帮助文档中找到了以下代码($String -split ",",2)[1],它似乎完全符合我的需求。 - DarkLite1

1

Aaron的方法是最好的,但我提出了我的解决方案。

$array="Header text,Text 1,Text 2,Text 3,Text 4," -split ','
$array[0],($array[1..($array.Length -1)] -join ",")

0
这个替代方案利用了PowerShell将数组分配给多个变量的能力。但请注意,-split运算符会在每个逗号处进行拆分,并且PowerShell内置的从数组转换回字符串的方法会导致元素被重新连接在一起,因此它不如String.Split高效,但在您的示例中,这是可以忽略不计的。
$OFS = ','
$Content = 'Header text,Text 1,Text 2,Text 3,Text 4,'

[String]$Header,[String]$Rest = $Content -split $OFS

$OFS = ' '
Write-Host "Header = $Header"
Write-Host "Rest   = $Rest"

最后,$OFS 是 PowerShell 中的一个特殊变量,它确定将数组元素连接回单个字符串时要使用哪个字符。默认情况下,它是一个空格。但它可以更改为任何字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接