在Powershell中第二个句点之后获取文本的子字符串

时间:2014-12-16 21:05:24

标签: powershell substring

我正在使用一个子串,它会在第二个'之前给我一切。'我之前使用过子串来获得第一个'。'之前的所有内容。

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

它完美无缺。对于第二个子串,这是我到目前为止的

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

但我确定这不对。我从$ netVer获得的值是2.0.5727,而第二个子串我试图让它返回2.0

5 个答案:

答案 0 :(得分:10)

不一定是最有效的方法,但您可以使用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。

答案 1 :(得分:5)

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

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

将产生“2.0”

答案 2 :(得分:3)

所以,这是第一个'.'

$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

答案 3 :(得分:1)

你的问题不清楚。你需要包括第二期吗?你想要第二期之前的所有东西,还是第一期和第二期之间的所有东西?

"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解决方案(这有点重复)。

答案 4 :(得分:0)

这是Matt上面回答的变体,但是使用了稍微不同的语义。我们再一次拆分并加入字符串:

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

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