Regex PowerShell替换字符串中的数字
我不是这样一个Regex PowerShell替换字符串中的数字,regex,string,powershell,replace,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" 至: $String = "\\Serve
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"
至:
$String = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$String = "\\Server\c$\share_1\share2_\Taget2[2] - 2014-07-29.log"
谢谢您的帮助。如果您想避免使用正则表达式:
$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
如果要避免使用正则表达式:
$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
使用正则表达式:
$s = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$s -replace "(?<=\[)(\d+)","bla"
所以你可以这样做:
$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
...
$re = [Regex]"\[(\d+)\]"
while (Test-Path -LiteralPath $filename) {
$filename = $re.Replace($filename, $callback)
}
使用正则表达式:
$s = "\\Server\c$\share_1\share2_\Taget2[1] - 2014-07-29.log"
$s -replace "(?<=\[)(\d+)","bla"
所以你可以这样做:
$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
...
$re = [Regex]"\[(\d+)\]"
while (Test-Path -LiteralPath $filename) {
$filename = $re.Replace($filename, $callback)
}
另一个选项是使用带有脚本块的
Regex
类的方法(代码取自Roman Kuzmin):
现有文件的处理方式如下:
$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
...
$re = [Regex]"\[(\d+)\]"
while (Test-Path -LiteralPath $filename) {
$filename = $re.Replace($filename, $callback)
}
请注意,必须在此处使用带有参数
-LiteralPath
的测试路径
,因为文件名包含方括号,否则会被解释为。另一个选项是使用带有脚本块的Regex
类的方法(代码取自Roman Kuzmin):
现有文件的处理方式如下:
$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
...
$re = [Regex]"\[(\d+)\]"
while (Test-Path -LiteralPath $filename) {
$filename = $re.Replace($filename, $callback)
}
请注意,必须在此处将
测试路径
与参数-LiteralPath
一起使用,因为您的文件名包含方括号,否则将被解释为正则表达式中的转义括号(它们是有意义的,不是文字):\[\d+\]
。如果您确定数字只能有一个或两个数字,那么您也可以明确表示:\[\d[\d]\]
或\[\d\d?\]
谢谢阿德里亚诺:)这似乎已经部分起作用了$String-替换“\[\d+\]”,“[bla]”
现在如何更新括号内的数字?在regex中转义括号(它们是有意义的,不是文字):\[\d+\]
。如果您确定数字只能有一个或两个数字,那么您也可以将其明确化:\[\d[\d]\]
或\[\d\d?\]
谢谢您Adriano:)这似乎已经部分起作用了$String-替换“\[\d+\]”,“[bla“
我现在如何更新括号内的数字?+1-同样重要的是要注意,此处添加的顺序很重要,1+
而不是…+1
。后者将连接一个字符串。谢谢Mjonior,这确实是一种很好的方法,我确实想知道为什么1+
在字符串之前。我更新了问题,以更好地反映我的问题。很抱歉造成混淆。我建议您问一个新问题,因为检查文件是否存在与增加文件名中的数字不同。+1-还需要注意的是,这里的加法顺序很重要,所以请注意1+
而不是…+1
。后者将连接一个字符串。谢谢Mjonior,这确实是一种很好的方法,我确实想知道为什么1+
在字符串之前。我更新了问题,以更好地反映我的问题。很抱歉造成混淆。我建议你问一个新问题,因为检查文件是否存在不同于增加文件名中的数字。谢谢你,拉夫,这会有用的。但是,在第二次运行脚本时,如何检查该文件名是否已在使用中?很难将正确的$Path
输入到测试路径
,因此它会创建新的文件名。与@Entbark所说的一样,请询问另一个问题,因为这两个问题完全不同。谢谢Raf,这会起作用。但是,在第二次运行脚本时,如何检查该文件名是否已在使用中?很难将正确的$Path
输入到测试路径
,因此它会创建新的文件名。与@Entbark所说的一样,请询问另一个问题,因为这两个问题完全不同。