gpt4 book ai didi

powershell - String.Split() 的奇怪结果

转载 作者:行者123 更新时间:2023-12-04 01:08:09 24 4
gpt4 key购买 nike

为什么以下结果会产生一个包含 7 个元素和 5 个空白的数组?我希望只有 2 个元素。
5个空白元素来自哪里?

$a = 'OU=RAH,OU=RAC'

$b = $a.Split('OU=')
$b.Count
$b

<#

Outputs:

7



RAH,


RAC

#>

最佳答案

订购 要按字符串(而不是一组字符)和/或正则表达式拆分,请使用 PowerShell 的 -split运算符(operator) :

PS> ('OU=RAH,OU=RAC' -split ',?OU=') -ne ''  # parentheses not strictly needed
RAH
RAC
  • -split默认将其 RHS 解释为正则表达式,而 ,?OU=两者都匹配 OU本身和 ,OU ,导致所需的拆分,将标记作为数组返回。
  • 对于 -split 支持的所有功能,包括文字字符串匹配、限制返回的标记数量以及脚本块的使用,参见 Get-Help about_split .

  • 然而,由于输入以匹配开始,-split将拆分的第一个元素视为空字符串。通过将结果 token 数组传递给 -ne '' ,我们过滤掉这些空字符串。

  • 相比之下, 在 Windows PowerShell 中 使用 .NET(FullCLR,最高 4.x) String.Split() method ,正如您所尝试的,工作方式非常不同:
    'OU=RAH,OU=RAC'.Split('OU=')
    OU=解释为字符数组,其中任何一个都单独作为分隔符 - 与指定字符的顺序无关。默认情况下,前导、相邻和尾随分隔符被视为分隔空标记,因此您会得到一个包含 7 个标记的数组: @( '', '', '', 'RAH,', '', '', 'RAC')备注 PowerShell 核心 用户(PowerShell 6 及以上版本):
    .NET 核心 String.Split()方法现在确实有一个标量 [string]寻找 entire string as the separator 的重载, PowerShell Core 默认选择 ;要获得描述的字符数组行为,您必须强制转换为 [char[]]明确地: 'OU=RAH,OU=RAC'.Split([char[]] 'OU=')
    如果您构建 .Split()仔细调用方法,您可以指定字符串,但请注意,您仍然无法获得正则表达式支持:
    PS> 'OU=RAH,OU=RAC'.Split([string[]] 'OU=', 'RemoveEmptyEntries')
    RAH,
    RAC
    可以按文字字符串拆分 OU= ,删除空条目,但如您所见,这不允许您考虑 ,您可以通过指定要拆分的字符串数组来更进一步,这在这种简单的情况下有效,但最终不会为您提供与 PowerShell 的 -split 的正则表达式相同的灵活性。运营商提供:
    PS> 'OU=RAH,OU=RAC'.Split([string[]] ('OU=', ',OU='), 'RemoveEmptyEntries')
    RAH
    RAC
    请注意,指定(数组)字符串需要方法调用的 2 参数形式,这意味着您还必须指定 System.StringSplitOptions enumeration value .使用 'None'不应用任何选项(在撰写本文时,唯一支持的 true 选项是 'RemoveEmptyEntries' ,如上所述)。
    (指定选项的类型安全方法是使用,例如, [System.StringSplitOptions]::None ,但是,将选项名称作为字符串传递是一种方便的快捷方式;例如, 'None' 。)

    关于powershell - String.Split() 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414946/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com