【问题标题】:Split a string with powershell to get the first and last element使用powershell拆分字符串以获取第一个和最后一个元素
【发布时间】:2015-11-12 18:19:05
【问题描述】:

如果你这样做:git describe --long

你会得到:0.3.1-15-g3b885c5

这就是上面字符串的意思:

Tag-CommitDistance-CommitId (http://git-scm.com/docs/git-describe)

如何拆分字符串以获得第一个 (Tag) 和最后一个 (CommitId) 元素?

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    通过使用 String.split() 和 count 参数来管理 commitid 中的破折号:

    $x = "0.3.1-15-g3b885c5"
    $tag = $x.split("-",3)[0]
    $commitid = $x.split("-",3)[-1]
    

    【讨论】:

    • 仅供参考,可以在单个表达式中完成:$a,$b = "0.3.1-15-g3b885c5".split('-')[0,2]
    • @Richard 你说得对,我只是想展示使用-1 来获取最后一个索引。
    • 在这里使用split() 与正则表达式没有任何问题。我喜欢正则表达式,但有时一个不太“复杂”的解决方案对未来的可读性和维护更好——原作者可能很好地理解正则表达式,但下一个支持脚本的人可能不会。对于更多涉及的文本解析和处理,我使用正则表达式 - 但对于像这样的简单拆分,我坚持使用 split()
    • 我们使用点符号作为标签,这里没有正则表达式朋友,所以你得到解决方案;-)
    【解决方案2】:

    注意:此答案侧重于改进 Richard's helpful answersplit-into-tokens-by-- 方法,但请注意该方法 不完全健壮,因为git 标签名称本身可能包含- 字符,因此您不能盲目假设第一个- 实例结束标签名称。
    考虑到这一点,请改用Richard's robust solution


    只是为了提供更符合 PowerShell 习惯的变体:

    # Stores '0.3.1' in $tag, and 'g3b885c5' in $commitId
    $tag, $commitId = ('0.3.1-15-g3b885c5' -split '-')[0, -1]
    
    • PowerShell 的-split operator 用于通过分隔符- 将输入字符串拆分为令牌数组
      虽然[string] 类型的.Split() 方法 在这里就足够了,但-split offers many advantages in general

    • [0, -1]-split 返回的数组中提取第一个 (0) 和最后一个 (-1) 元素,并将它们作为 2 元素数组返回。

    • $tag, $commitId = 是一个解构多重赋值,它将生成的 2 元素数组的元素分别分配给一个变量。

    【讨论】:

      【解决方案3】:

      我不记得标签中是否允许使用破折号,所以我假设它们是,但不会出现在最后两个字段中。

      因此:

      if ("0.3.1-15-g3b885c5" -match '(.*)-\d+-([^-]+)') {
        $tag = $Matches[1];
        $commitId = $Matches[2]
      }
      

      【讨论】:

      • 干得好;实际上,标签名称可能包含连字符(破折号);验证git check-ref-format --allow-onelevel '0.3.1-pre.1'; $LASTEXITCODE -eq 0
      猜你喜欢
      • 2018-12-26
      • 2016-09-20
      • 2013-01-02
      • 2020-08-25
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多