Powershell split()vs -split - 有什么区别?

时间:2014-05-22 02:39:43

标签: powershell split

经过半个小时的努力,我在使用空格分割字符串时遇到了这种差异,具体取决于您使用的语法。

简单字符串:

$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,它是否需要正确解释它应该使用两个字符作为分隔符的事实?

3 个答案:

答案 0 :(得分:2)

.Net System.String.Split方法没有带有单个参数的重载,该参数是一个字符串。它也不了解正则表达式。

正在发生的事情是,powershell正在接收您传入的字符串并将其转换为字符数组。它基本上分为以下字符:\s+

当你使用": "作为分隔符时,我会想象你得到了像

这样的结果
1

2

3

4

5

这是因为没有为.Net方法指定字符串拆分选项,它将包含它在相邻分隔符之间找到的空字符串。

答案 1 :(得分:1)

  1. .Net对象不接受正则表达式,但将其解释为文字字符串。

    $line = "1: 2: 3: 4: 5: "
    $ln = $line.split("\s")
    $ln
    
  2. 输出:

    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方法采用字符数组参数(不是字符串)。如果指定多个字符,它将在任何这些字符的任何实例上拆分。