【问题标题】:Is there a reason why .split in PowerShell doesn't work for me?PowerShell 中的 .split 对我不起作用有什么原因吗?
【发布时间】:2020-06-25 01:37:54
【问题描述】:
$fID = Read-Host "Enter URL" 

if($fID -Match "/"){

$fID = $fID.split("/")[1].split(".")[0]

}

$fID[1] 

输入:https://split.string.com(例如)

我想要的只是“split

输出:什么都没有

有人可以帮忙吗?

【问题讨论】:

  • 你的问题不是你的分裂... ;-) $fID = $fID.split("/")[1].split(".")[0] 应该是$fID = $fID.split("/")[2].split(".")[0] ... 而$fID[1] 应该是$fID

标签: string powershell split


【解决方案1】:

问题是分隔符/ 会被输入字符串中的/每次出现 分割,因此https://split.string.com 中的// 会导致额外的空 生成的标记数组中的元素(两个 / 字符之间的空字符串。),这是索引 [1] 返回的内容。

PowerShell [Core] 6+ 中,只需使用 // 作为分隔符

PSCore> 'https://split.string.com'.split('//')[1].split('.')[0]
split

这在 Windows PowerShell 中不起作用,但是,因为底层 .NET Framework 不支持按单个 [string] 实例进行拆分(相反,它的单个字符 被解释为分隔符)。

在那里,您可以简单地考虑额外的空元素并相应地调整索引,正如Olaf 建议的那样:

WinPS> 'https://split.string.com'.split('/')[2].split('.')[0]
split

注意:通过可选参数消除空条目也可以,但既冗长又晦涩:'https://split.string.com'.split('/', [StringSplitOptions]::RemoveEmptyEntries)[1].Split('.')[0]


替代方法使用 PowerShell 的基于正则表达式的 -split operator,这通常优于 [string] 类型的.Split() 方法 并且适用于两个 PowerShell 版本:

PS> ('https://split.string.com' -split '//|\.')[1]
split

Regex //|\. 匹配 (|) 字符串 // 或文字 .(转义为 \.,因为 . 本身在正则表达式中具有特殊含义)。

有关背景信息,请参阅 this answer,包括为什么坚持使用 PowerShell 原生功能可以防止由于稍后引入新的 .NET 方法重载而导致无意的行为变化。

【讨论】:

    【解决方案2】:

    补充 @mklement0 对实际“为什么”问题的全面回答:
    我会从不同的角度来看待这个问题,从uri 类的host 属性开始:

    # $fID = [uri](Read-Host "Enter URL" )
    $fID = [uri]'https://split.string.com'
    
    $fID.Host.Split('.')[0]
    

    产量

     split
    

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 1970-01-01
      • 2013-07-24
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 2021-11-05
      相关资源
      最近更新 更多