代码之家  ›  专栏  ›  技术社区  ›  Racoon

Powershell:拆分实现中的差异

  •  -2
  • Racoon  · 技术社区  · 5 年前

    简单字符串:

    $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

    然而,当我尝试第一种方法时 ": " ,也不能正常工作。如果它是.NET,它是否需要一些东西来正确解释它应该使用两个字符作为分隔符这一事实?

    0 回复  |  直到 10 年前
        1
  •  3
  •   mklement0    6 年前

    System.String.Split 方法没有采用单个字符串参数的重载。它也不理解regex。

    所发生的是powershell正在获取您传入的字符串并将其转换为一个字符数组。它本质上是在以下字符处分裂 : , \ , s , +

    ": " 作为分隔符,我想您得到的结果如下

    1
    
    2
    
    3
    
    4
    
    5
    

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

        2
  •  1
  •   Csharp Guy    10 年前
    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”解释为有效的regex,即空格。因为它可以在字符串中同时找到:和\s,所以“:\s”的组合用于拆分。

    $line = "1:2:3: 4: 5: "
    $ln = $line -split ":"
    $ln
    

    输出:

    1
    2
    3
     4
     5
    
        3
  •  0
  •   mjolinor    10 年前

    string split方法接受一个字符数组参数(而不是字符串)。如果指定多个字符,它将在这些字符的任何实例上拆分。