我不是这样的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"
感谢您的帮助。
答案 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