【问题标题】:Substring to Get Text after Second Period in Powershell在 Powershell 中的第二个周期后获取文本的子字符串
【发布时间】:2014-12-16 21:05:23
【问题描述】:

我正在使用一个子字符串,它将在第二个 '.' 之前给我所有的东西。我之前使用过子字符串来获取第一个 '.' 之前的所有内容。

$id = $file.Substring(0, $File.LastIndexof('.'))

而且效果很好。对于第二个子字符串,这是我迄今为止所拥有的

$netVerShort = $netVer.Substring(0,  2nd ('.'))

但我确定这是不对的。我从 $netVer 得到的值是 2.0.5727 并且使用第二个子字符串我试图让它返回 2.0

【问题讨论】:

标签: powershell substring


【解决方案1】:

所以,这是第一个'.'

$x.IndexOf('.')

这是第一个'.'之后的所有内容:

$x.Substring($x.IndexOf('.') + 1)

这是第一个'.'之后的第一个'.'(所以,第二个句号):

$x.Substring($x.IndexOf('.') + 1).IndexOf('.')

所以,我们想要的字符串长度是:

$x.IndexOf('.') + 1 + $x.Substring($x.IndexOf('.') + 1).IndexOf('.')

所以,我们想要字符串,从开头开始,其长度足以在第二个句点之前到达:

$x.Substring(0, $x.IndexOf('.') + 1 + $x.Substring($x.IndexOf('.') + 1).IndexOf('.'))

所以:

PS C:\> $x = '198.51.100.5';
PS C:\> $x.Substring(0, $x.IndexOf('.') + 1 + $x.Substring($x.IndexOf('.') + 1).IndexOf('.'))
198.51

【讨论】:

  • 这对我来说真的很有用:)
【解决方案2】:

如果您使用的是版本号,可以为您进行解析的 System.Version 类:

$netVer = "2.0.5727"
$v = [version]$netVer
$netVerShort = "$($v.Major).$($v.Minor)"

将产生“2.0”

【讨论】:

    【解决方案3】:

    这是上面马特答案的变体,但使用的语义略有不同。同样,我们拆分并加入字符串:

    ("this.is the end.bagels.are good.oh yes" -split "\.")[0..1] -join "."
    

    在此,我们将 Matt 使用的 select -index 替换为数组范围 [0..1],并使用原生 -split-join 运算符。它比马特的效率更高吗?就击键而言,它是:-) 但在计算上可能没有太大差异(如果有的话)。

    【讨论】:

      【解决方案4】:

      不一定是最有效的方法,但您可以为此使用 split 并重新加入您正在寻找的元素。取以下字符串:

      $stuff = "This.is the end. Bagels. are. awesome."
      

      现在我们将其拆分为句点,然后将前两个元素重新组合在一起。

      PS C:\Users\mcameron> $stuff.Split(".",3)
      This
      is the end
       Bagels. are. awesome.
      

      3 是说我们只需要返回 3 个元素。根据您有多少个时期,这可能是一个不浪费时间的好主意。接下来我们需要加入你想要的2个元素。

      PS C:\Users\mcameron> ($stuff.Split(".",3) | Select -Index 0,1) -join "."
      This.is the end
      

      要解决您的.SubString() 方法,您需要检查两次,因为您将拥有第一个,然后您需要找到第二个。

      PS C:\Users\mcameron> $stuff.Substring($stuff.IndexOf(".",$stuff.IndexOf(".") + 1))
      . Bagels. are. awesome.
      

      使用$stuff.IndexOf(".") 获取第一个索引,然后在返回值上加 1。使用该值作为搜索下一个周期的起始索引。然后将其用于子字符串。如果您不希望期间成为回报的一部分,则在整个事情上加 1。

      【讨论】:

        【解决方案5】:

        您的问题不清楚。你需要包括第二个时期吗?您想要第二期之前的所有内容,还是只想要第一期和第二期之间的内容?

        "th1 s.!s.a.test" -replace '^(.+?\..+?)\..*', '$1'
        th1 s.!s
        

        如果你需要将它们分开,你可以试试这个:

        "th1 s.!s.a.test" -replace '^(.+?)\.(.+?)\..*', '$1'
        th1 s
        
        "th1 s.!s.a.test" -replace '^(.+?)\.(.+?)\..*', '$2'
        !s
        

        如果你只需要主要和次要版本,试试:

        "2.0.5727" -replace '^(\d+\.\d+).*', '$1'
        2.0
        

        就个人而言,我会在您的其他问题中使用mjolinor suggested 的正确.Net 解决方案(这有点重复)。

        【讨论】:

          猜你喜欢
          • 2017-05-06
          • 1970-01-01
          • 2019-09-27
          • 2022-06-17
          • 2022-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-27
          相关资源
          最近更新 更多