如何用另一个角色替换第n个角色

时间:2017-12-22 05:06:57

标签: .net regex powershell

鉴于此字符串:

2017.12.21.5

...如何将其转换为:

2017.12.21-5

匹配将始终在.的第3次出现。

我在PowerShell脚本中运行它。

我在这里尝试了太多的排列;到目前为止,我还没有接近。

- 编辑 -

此外,第二个和第三个八位字节(月份和日期)将在一到两位数之间变化。第四个(当天发布)也可能包含三位数字。

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式匹配第3次出现。

(?<=\.\d+\.\d+)\.

答案 1 :(得分:2)

您可以使用拆分和加入

$var='2017.12.21.5'
$split=$var -split '\.'
($split[0..2] -join '.') + '-' + $split[3] 

答案 2 :(得分:1)

没有办法定位和替换第n个字符,所以我们只需要定位整个字符串并复制未更改的部分

Current Transaction Name - parentMethod ::: TestTransaction
Is the transaction readonly - parentMethod ::: false
Current Transaction Name - child1 ::: null
Is the transaction readonly - child1 ::: true
Current Transaction Name - child2 ::: null
Is the transaction readonly - child2 ::: false

答案 3 :(得分:1)

编辑:我将最后一个函数简化为此。

$InputStr = "2017.12.21.5"
$matchVal = '.'
$replaceVal='-'
$num = 3

#searched is:
$OutputStr=$InputStr

$positions = (0..($InputStr.ToCharArray().Count-2)|ForEach-Object{$InputStr.IndexOf($matchVal,$_)}|Select-Object -Unique)
if($num -lt $positions.Count+1){
    $OutputStr = $InputStr.Remove($positions[$num-1],1).Insert($positions[$num-1], $replaceVal)
}

所以它获取$matchVal$positions的所有位置,然后检查$num&lt; =位置计数。如果是这样,$InputStr的{​​{1}}字符将替换为$position[$num-1]