PowerShell替换字符串中的数字

时间:2014-07-29 13:03:29

标签: regex string powershell replace

我不是这样的regex专家,而且坦率地说我会尽我所能避免它。

我想创建一个新的$String,其中字符串中的数字用+1更新。这个数字可以是一位或两位数,并且总是在两个括号之间。

发件人:

$String = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"

$String = "\\Server\c$\share_1\share2_\Taget2[2] - 2014-07-29.log"

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

如果你想避免使用正则表达式:

$String = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$parts = $string.Split('[]')
$Newstring = '{0}[{1}]{2}' -f $parts[0],(1 + $parts[1]),$parts[2]
$Newstring
\\Server\c$\share_1\share2_\Taget2[2] - 2014-07-29.log

答案 1 :(得分:1)

另一种选择是使用Regex类的Replace()方法和一个脚本块(代码取自Roman Kuzmin的this answer):

$callback = {
  $v = [int]$args[0].Groups[1].Value
  $args[0] -replace $v,++$v
}

$filename = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"

$re = [Regex]"\[(\d+)\]"
$re.Replace($filename, $callback)

现有文件可以像这样处理:

...
$re = [Regex]"\[(\d+)\]"
while (Test-Path -LiteralPath $filename) {
  $filename = $re.Replace($filename, $callback)
}

请注意,您必须使用Test-Path参数-LiteralPath,因为您的文件名包含方括号,否则将被解释为wildcard characters。< / p>

答案 2 :(得分:0)

使用正则表达式:

$s = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$s -replace "(?<=\[)(\d+)","bla"

结果:

\\Server\c$\share_1\share2_\Taget2[bla] - 2014-07-29.log

所以你可以这样做:

$s = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$s -match "(?<=\[)(\d+)" | Out-Null  ## find regex matches
$newNumber = [int]$matches[0] + 1
$s -replace "(?<=\[)(\d+)",$newNumber

结果:

\\Server\c$\share_1\share2_\Taget2[2] - 2014-07-29.log