经过半个小时的努力,我在使用空格分割字符串时遇到了这种差异,具体取决于您使用的语法。
简单字符串:
$line = "1: 2: 3: 4: 5: "
拆分示例1 - 请注意从1开始使用令牌的额外空间:
$ln = $line.split(":\s+")
$ln
1
2
3
4
5
拆分示例2 - 空格消失了(因为它们应该)
$ln = $line -split ":\s+"
$ln
1
2
3
4
5
我怀疑它是因为第一个是.NET方法(?),而-split
PS运算符在正则表达式解释方面可能有更多的实用智能。
然而,当我尝试使用像": "
这样的分割的第一种方法时,它也没有正常工作。如果它是.NET,它是否需要正确解释它应该使用两个字符作为分隔符的事实?
答案 0 :(得分:2)
.Net System.String.Split方法没有带有单个参数的重载,该参数是一个字符串。它也不了解正则表达式。
正在发生的事情是,powershell正在接收您传入的字符串并将其转换为字符数组。它基本上分为以下字符:
,\
,s
,+
当你使用": "
作为分隔符时,我会想象你得到了像
1
2
3
4
5
这是因为没有为.Net方法指定字符串拆分选项,它将包含它在相邻分隔符之间找到的空字符串。
答案 1 :(得分:1)
.Net对象不接受正则表达式,但将其解释为文字字符串。
$line = "1: 2: 3: 4: 5: "
$ln = $line.split("\s")
$ln
输出:
1: 2: 3: 4: 5:
因此,在您的示例中,“+”被忽略,因为它在$ ln中找不到,但“:\ s”用于拆分:
$ln = $line.split(":\s+")
$ln
Output:
1
2
3
4
5
与
相同$ln = $line.split(":")
$ln
2.而powershell -split运算符将“\ s”解释为有效的正则表达式,即空格。因为,它可以在字符串中找到:和\ s,“:\ s”的组合用于分割。 例如:
$line = "1:2:3: 4: 5: "
$ln = $line -split ":"
$ln
输出:
1
2
3
4
5
答案 2 :(得分:0)
string split方法采用字符数组参数(不是字符串)。如果指定多个字符,它将在任何这些字符的任何实例上拆分。