我有一個陣列元素,我試圖用字母替換所有數字。這是操作前的陣列元素:
$a[0].object
--- OUTPUT ---
518773112
我將數字轉換為字串并將其存盤在$e. 然后我找到該字串的長度并將其存盤在$d
$e = $a[0].object.ToString()
$d = $a[0].object.ToString().length
$e
$d
---OUTPUT---
518773112
9
然后我嘗試遍歷字串以用字母替換數字。我放置$i在子字串中以獲取我要替換的數字。然后我使用 anif-statement查看該子字串是否等于數字,如果是,則使用 replace 方法嘗試將數字替換為字母。
for($i=0; $i -lt $d; $i ){
$pos = $e.Substring($i,1)
if($pos -eq '0'){$e = $pos.replace('0', 'A')}
if($pos -eq '1'){$e = $pos.replace('1', 'B')}
if($pos -eq '2'){$e = $pos.replace('2', 'C')}
if($pos -eq '3'){$e = $pos.replace('3', 'D')}
if($pos -eq '4'){$e = $pos.replace('4', 'E')}
if($pos -eq '5'){$e = $pos.replace('5', 'F')}
if($pos -eq '6'){$e = $pos.replace('6', 'G')}
if($pos -eq '7'){$e = $pos.replace('7', 'H')}
if($pos -eq '8'){$e = $pos.replace('8', 'I')}
if($pos -eq '9'){$e = $pos.replace('9', 'J')}
}
不過,我的問題是將字母連接到數字字串的末尾:
518773112FBIHHDBBC
很可能,因為 =我then的if-statement. 但是,當我替換為時 =,=我的 Substring 方法出現錯誤:
Exception calling "Substring" with "2" argument(s): "startIndex cannot be larger than length of string.
我已經檢查過$i,$d并且在我運行回圈之前它們設定正確。所以,我有點困惑。我錯過了什么?
uj5u.com熱心網友回復:
要通過單個基于正則運算式的-replace操作為現有的有用答案添加簡潔的替代方案:
# PowerShell (Core) 7 only.
# -> 'FBIHHDBBC'
'518773112' -replace '\d', { [char] ([int] [char] 'A' [int] $_.Value) }
# Windows PowerShell alternative:
# (requires direct use of underlying .NET APIs)
[regex]::Replace('518773112', '\d', { param($m) [char] ([int] [char] 'A' [int] $m.Value) })
正則運算式轉義序列
\d匹配任何一個十進制數字。[int] [char] 'A' [int] $_.Value將捕獲的數字 ($_.Value) 的值作為整數添加到字符的整數表示中A,即它向Unicode 代碼點添加偏移量A。然后將生成的代碼點重新轉換為字符 (
[char]),從而產生感興趣的字母。
至于你嘗試了什么:
撇開您的方法效率低下不談,問題是您試圖在與輸入字串相同的變數中構建結果字串:
=因此將所需的結果附加到輸入字串- 只是
=本質上用正在處理的單個字符替換.Substring()了輸入字串,導致后續呼叫失敗,因為該字串現在已減少為單個字符。
直接的解決方法是在一個新變數中構建結果(但請注意,此處答案中提供的所有解決方案都是可取的):
$e = '518773112'
$d = $e.Length
$result = '' # initialize result string
for($i=0; $i -lt $d; $i ){
$pos = $e.Substring($i,1)
# Use = on *$result*
if($pos -eq '0'){$result = $pos.replace('0', 'A')}
if($pos -eq '1'){$result = $pos.replace('1', 'B')}
if($pos -eq '2'){$result = $pos.replace('2', 'C')}
if($pos -eq '3'){$result = $pos.replace('3', 'D')}
if($pos -eq '4'){$result = $pos.replace('4', 'E')}
if($pos -eq '5'){$result = $pos.replace('5', 'F')}
if($pos -eq '6'){$result = $pos.replace('6', 'G')}
if($pos -eq '7'){$result = $pos.replace('7', 'H')}
if($pos -eq '8'){$result = $pos.replace('8', 'I')}
if($pos -eq '9'){$result = $pos.replace('9', 'J')}
}
$result # Output the result: -> 'FBIHHDBBC'
uj5u.com熱心網友回復:
該String.Replace()方法將為您替換任何匹配的字符或子字串,您不需要單獨處理(甚至關心)字串中的每個位置:
$e = '518773112'
foreach($digit in 0..9){
# calculate next letter character
$substitute = ($digit 'A'[0]) -as [char]
# replace all instances of $digit with $substitute
$e = $e.Replace("$digit", $substitute)
}
現在的值$e是“FBIHHDBBC”
uj5u.com熱心網友回復:
這是我的兩分錢:
-join ('518773112' -split '(.)' -ne '' | Foreach-Object { [char]([int]$_ 65)})
結果:
FBIHHDBBC
替代Select-Object:
-join ('518773112' -split '(.)' -ne '' | Select-Object @{Name = 'Chr'; Expression = {[char]([int]$_ 65)}}).Chr
uj5u.com熱心網友回復:
另一個簡潔的(靈感來自Theo 的有用答案):
-join '518773112'.ToCharArray().ForEach{[char]([int]$_ 17)}
這會將輸入字串轉換為 char 陣列,然后使用 PowerShell 的內部方法回圈遍歷每個字符ForEach。
在字符的代碼點的腳本塊中ForEach遞增到數字范圍內'0'.. '9',然后轉換回字符。“神奇”數字17只是字符代碼點'A'和'0'(即[int][char]'A' - [int][char]'0'輸出17)之間的差異。
最后,運算子的一元形式-join用于從單個字符創建單個字串。
uj5u.com熱心網友回復:
$e將顯示為 concatenated ,這是因為您$e通過回圈連接。
該函式subString回傳$e該 subed 的副本。
你應該宣告一個新的變數,
$a[0] = 518773112;
$e = $a[0].ToString()
$d = $a[0].ToString().length
$str = ""
for($i=0; $i -lt $d; $i ){
$pos = $e.Substring($i,1)
if($pos -eq '0'){$str = $pos.replace('0', 'A')}
if($pos -eq '1'){$str = $pos.replace('1', 'B')}
if($pos -eq '2'){$str = $pos.replace('2', 'C')}
if($pos -eq '3'){$str = $pos.replace('3', 'D')}
if($pos -eq '4'){$str = $pos.replace('4', 'E')}
if($pos -eq '5'){$str = $pos.replace('5', 'F')}
if($pos -eq '6'){$str = $pos.replace('6', 'G')}
if($pos -eq '7'){$str = $pos.replace('7', 'H')}
if($pos -eq '8'){$str = $pos.replace('8', 'I')}
if($pos -eq '9'){$str = $pos.replace('9', 'J')}
}
Write-Output $str;
雖然有更好的方法來做同樣的作業
uj5u.com熱心網友回復:
請注意,此示例假定值僅為整數。
這是解決此問題的一種方法,首先生成一個字符集A,J然后拆分.object屬性的值以生成這些數字的陣列,然后我們可以將其用于對字符集進行索引:
$char = [char[]]([char]'A'..[char]'J')
$a = [pscustomobject]@{
object = 518773112
}
$transform = $a.object.ToString() -split '' -ne ''
$a.object = [string]::new($char[$transform])
結果應該是:
PS /> $a
object
------
FBIHHDBBC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461078.html
上一篇:如何參考二維陣列?
