【问题标题】:Can I use split on a string two times in a row using piping?我可以使用管道连续两次在字符串上使用拆分吗?
【发布时间】:2019-03-20 09:41:57
【问题描述】:

假设我有以下字符串dog.puppy/cat.kitten/bear.cub。我只想得到bear。我可以通过执行以下操作来做到这一点:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2]
$str = $str.split('.')[0]

我是否可以通过管道使用一条线获得bear?这不起作用,但它会是这样的:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2] | $_.split('.')[0]

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我是否能够使用一条线使用管道获得“熊”?

    字符串已经存储在内存中,没有充分的理由使用 管道 - 它只会减慢速度。

    相反,使用 PowerShell 的运算符,它们比使用管道更快并且通常更灵活与 .NET [string] 类型的方法类似,因为它们正则表达式(正则表达式)上进行操作,并且还可以对整个数组进行操作

    PS> ('dog.puppy/cat.kitten/bear.cub' -split '[/.]')[-2]
    bear
    

    也就是说,用文字/ 或文字.(使用字符集[...])拆分输入字符串,并返回倒数第二个(倒数第二个)([-2])标记。

    例如,请参阅this answer,了解为什么您通常应该更喜欢-split operator 而不是String.Split() 方法
    这同样适用于更喜欢-replace operator 而不是String.Replace() 方法。


    链接这些操作符很容易

    PS> ('dog.puppy/cat.kitten/bearOneTwoThree.cub' -split '[/.]')[-2] -csplit '(?=\p{Lu})'
    bear
    One
    Two
    Three
    

    也就是说,只要大写字母 (\p{Lu}) 开始,使用positive look-ahead assertion, (?=...)。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      $str = "dog.puppy/cat.kitten/bear.cub".split('/')[2].split('.')[0]
      

      不需要管道。

      【讨论】:

      • 谢谢,效果很好。接下来我需要根据大写字母拆分字符串,假设字符串是dog.puppy/cat.kitten/bearOneTwoThree.cub,我需要使用-creplace ".(?=[^a-z])", "$ 实现的结果bear One Two Three &"。我可以在一行中做到这一点吗?
      • 我建议为此打开一个单独的问题,并将问题简化为仅使用 bearOneTwoThree 文本。
      • 我刚刚想通了。我只需要$str = $str.split('/')[2].split('.')[0] | ForEach-object { $_ -creplace '.(?=[^a-z])','$& ' }
      【解决方案3】:

      有一个更简单的解决方案,
      .split() 方法使用每个字符进行拆分,
      使用负索引从后面计数,所以

      > "dog.puppy/cat.kitten/bear.cub".split( '/.')[-2]
      bear
      

      您的其他问题可以通过基于正则表达式的-csplit 运算符使用
      nonconsuming positive lookahead
      来解决 最后一个 -join ' ' 用空格连接数组元素。

      $str = "dog.puppy/cat.kitten/bearOneTwoThree.cub"
      $str = $str.split('/.')[-2] -csplit '(?=[A-Z])' -join ' '
      $str
      bear One Two Three
      

      【讨论】:

      • 很不幸,但要使您的.Split() 调用也可以在 PowerShell Core 中工作,您必须使用"dog.puppy/cat.kitten/bear.cub".split([char[]] '/.')[-2] - 请参阅@987654322 的(更新的)底部部分@ 解释(并感谢最近的编辑)。
      猜你喜欢
      • 2016-11-28
      • 2011-02-10
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      相关资源
      最近更新 更多