通过索引

时间:2016-08-10 19:11:45

标签: string powershell indexing

我试图替换字符串中的字符,在本例中是一个数字,另一个数字增加1,然后将其添加回原始字符串并替换前一个数字字符

在以下代码段中,执行此代码后,sams2应变为sams3

但是,我一直收到错误,Unable to index into an object of type System.String.是否无法通过索引替换字符?对于这样的事情,有更好的方法吗?

$SAMAccountName = "sams2"
                $lastChar = $SAMAccountName.Length - 1

                    [int]$intNum = [convert]::ToInt32($SAMAccountName[$lastChar])
                    $convertedChar = [convert]::ToString($intNum + 1)
                    $SAMAccountName[$lastChar] = $convertedChar

4 个答案:

答案 0 :(得分:1)

只有增量数是一位数时才会有效。

$SAMAccountName = "sams2"
$partOne = $SAMAccountName.SubString(0, $SAMAccountName.Length - 1)
$partTwo = [int]$SAMAccountName.SubString($SAMAccountName.Length - 1, 1) + 1
$SAMAccountName = "$partOne$partTwo"

答案 1 :(得分:0)

好的,这是一个两步过程。首先我们得到数字,然后我们在字符串中替换该数字。

'sams2' |%{
    $Int = 1+ ($_ -replace "^.*?(\d+)$",'$1')
    $_ -replace "\d+$",$Int
}

答案 2 :(得分:0)

也许尝试正则表达式和组,然后能够免费处理多位数...

$SAMAccountName = "sam2"
# use regex101.com for help with regular expressions
if ($SAMAccountName -match "(.*?)(\d+)")
{
    # uncomment for debugging
    #$Matches
    $newSAMAccountName = $Matches[1] + (([int]$Matches[2])+1)
    $newSAMAccountName
}

答案 3 :(得分:0)

您的代码中有几点需要注意:

  1. 字符串是不可变的。每次进行一些更改时都会创建新的字符串实例。
  2. 使用StringBuilder来处理各个字符。
  3. 确保您有兼容的类型。字符串不是字符。
  4. 请看下面的代码:

    $SAMAccountName = "sams2"
    $sb = [System.Text.StringBuilder]$SAMAccountName
    $lastChar = $SAMAccountName.Length - 1
    [int]$intNum = [convert]::ToInt32($SAMAccountName[$lastChar])
    $covertedChar = [convert]::ToChar($intNum + 1)
    $sb[$lastChar] = $covertedChar
    [string]$sb
    

    您还可以使用其他方法,例如以下方法:

    $SAMAccountName = "sams2"
    $SAMAccountName.Substring(0, $SAMAccountName.Length-1)+([int]$SAMAccountName.Substring($SAMAccountName.Length-1, 1)+1)