输入字母数字字符串,发送到较低位置,然后进行评估。然后,每三个字母都需要大写并返回一个字符串。数字/字母位置并不总是相同。
示例输入处理:
$in = read-host "value in"
$var1 = $in.tolower()
所以我给出了两个可以用作示例的变量
$var1 = 1ab23c4def56
# $var1 = a123bcd45e6f # alternate $var1 for example purposes
$val = ($var1).ToCharArray()
foreach ($n in $val){
if ($n -notmatch "[0-9]"){
$alfaNo++
if ($alfaNo -eq 4){
$o = $([char]::ToUpper($n))
$alfaNo = 0
$n = $o
}
echo $n
}
else {echo $n}
}
$val
问题是循环显示每个适当的字符都会显示在上面,但是当最后显示$val
时不会进行更改。
答案 0 :(得分:2)
看起来您正在处理范围问题。在ForEach
循环中,变量位于不影响它们来自的数组的范围内。没有完全重写的简单修改就是简单地添加一个新变量,并将其设置为ForEach
循环的输出,然后使ForEach
循环输出$n
而不是回应它(或除此之外)。
现在,就我可以告诉你的If
声明是错误的而且正确的字母实际上并没有被大写,但除此之外至少让你的代码按照你想要的方式运行:
$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f # alternate $var1 for example purposes
$val = ($var1).ToCharArray()
$alfaNo = 0
$NewVal = foreach ($n in $val){
if ($n -notmatch "[0-9]"){
$alfaNo++
if ($alfaNo -eq 4){
$o = $([char]::ToUpper($n))
$alfaNo = 0
$n = $o
}
}
$n
}
$newval -join ''
我个人使用Switch
命令代替ForEach
所有If
语句。类似的东西:
$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f # alternate $var1 for example purposes
$inc = 0
$NewVal = Switch($var1 -Split ''){
{$_ -match "\d"} {$_;continue}
{$_ -match "[a-z]" -and $inc -lt 2} {$_;$inc++;continue}
{$_ -match "[a-z]"} {$inc = 0;[char]::toupper($_)}
}
$NewVal -join ''
答案 1 :(得分:1)
您正在修改$ n的值,但不修改原始数组$ val。
试试这个......
$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f # alternate $var1 for example purposes
$val = ($var1).ToCharArray()
$alfaNo = 0
for($i=0;$i -le $val.Length;$i++){
if ($val[$i] -notmatch "[0-9]"){
$alfaNo++
if ($alfaNo -eq 3){
$val[$i] = $([char]::ToUpper($val[$i]))
$alfaNo = 0
}
echo $val[$i]
}
else {echo $val[$i]}
}
$val
答案 2 :(得分:1)
这是另一种方法。 如果你想在String中得到结果,你必须像这样创建一个新的String对象。
$var1 = '1ab23c4def56'
$val = ($var1).ToCharArray()
for( $n=0 ; $n -lt $val.length ; $n++)
{
if( (($n % 3) -eq 2) -AND ($val[$n] -match "[a-z]") )
{
$val[$n] = [char]::ToUpper($val[$n])
}
}
$var1 = New-Object System.String ($val,0,$val.Length)
$var1
答案 3 :(得分:1)
另一种选择:
$var1 = '1ab23c4def56'
$i=0
$var1 =
$([string[]][char[]]$var1 |
foreach {
if (++$i %3) { $_ }
else { $_.ToUpper() }
}) -join ''
$var1