【问题标题】:PowerShell Replace number in stringPowerShell替换字符串中的数字
【发布时间】:2014-09-20 20:47:03
【问题描述】:

我不是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"

感谢您的帮助。

【问题讨论】:

  • 正则表达式中的转义括号(它们是有意义的,而不是文字):\[\d+\]。如果您确定数字只能有一位或两位数字,那么您也可以明确表示:\[\d[\d]\]\[\d\d?\]
  • 谢谢阿德里亚诺 :) 这似乎已经部分工作了$String -replace "\[\d+\]",'[bla]'我现在如何更新括号内的数字?

标签: regex string powershell replace


【解决方案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

【讨论】:

    【解决方案2】:

    使用正则表达式:

    $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
    

    【讨论】:

    • 谢谢 Raf,这会起作用。但是,如何在第二次运行脚本时检查该文件名是否已在使用中?很难将正确的$Path 提供给Test-Path,因此它会创建新的文件名。
    • 对@Entbark 所说的话,再问一个问题,因为两者完全不同。
    【解决方案3】:

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

    $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 + 而不是...+ 1。后者将连接一个字符串。
    • 感谢 mjoninor,这确实是一种好方法,我确实想知道为什么 1+ 在字符串之前。我已经更新了问题以更好地反映我的问题。很抱歉造成混乱。
    • 我建议提出一个新问题,因为检查文件是否存在与增加文件名中的数字不同。
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2013-02-01
    • 2017-03-06
    • 2011-01-20
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多