我有一個包含許多斜杠的字串,例如:$message = ab/cde/f/ghijklm/no/p
我想要一個函式,當在這個函式上運行時,它$message會回傳一個$slash_array帶有所有斜線位置值的 a 。
即,在我上面的例子中,我會:
PS > Write-Output $slash_array
3,7,9,17,20
然后我想使用這些值在每個字符之后插入一個斜杠,除非它位于這些位置之一(我不希望程式在已經存在的斜杠之后添加斜杠)。
============================== 編輯==================== ========
首先,一點旁注:你可能會覺得我不禮貌,但@phcluv 洗掉了所有的介紹性句子(這在 stackoverflow 中是正常的嗎?這里很新......)
我試圖在這里簡化問題,但實際上:
$message = "my name is silloky"
我希望/每個字符之間有一個斜線 ( ),兩個單詞之間有一個雙斜線 ( //),所以我的訊息看起來像這樣:(m/y//n/a/m/e//i/s//s/i/l/l/o/k/y或者最后有一個斜線,我真的不在乎)。
所以我想用 1 個斜杠替換原始訊息中的空格,然后在每個字符后插入斜杠(因此,如果那里已經有一個斜杠,那將是 2 個斜杠),除非它是一個斜杠(我們將有斜線replace,在它之前的insert字符之后,以及insert在斜線之后,斜線是一個字符,這將產生3個斜線)。我認為 PS 無法判斷當前字符是否是 a ,所以我認為我最好使用一個可以忽略/的位置陣列。insert所以就在我打電話給你的時候...
我有一些靈感來自你們所有人的想法......如果我自己發布答案并接受它可以嗎?或者我應該發布一個明確的答案,但接受最有幫助的答案?
uj5u.com熱心網友回復:
只需遍歷字符并檢查然后回傳索引
PS C:\> $message = "ab/cde/f/ghijklm/no/p"
PS C:\> $slash_array = for ($i = 0; $i -lt $message.Length; $i )
{ if ($message[$i] -eq '/') { $i 1 } }
PS C:\> $slash_array
3
7
9
17
20
PS C:\> $slash_array -join ', '
3, 7, 9, 17, 20
PS C:\>
但是,如果您只想在任何非斜杠字符之后插入斜杠,為什么不只進行正則運算式匹配然后替換?
PS C:\> $message -replace '([^/])(?!/)', '$1/'
a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/
([^/])(?!/)匹配后面沒有斜杠的非斜杠字符,然后在匹配的字符后添加斜杠
其他一些選擇:
PS C:\> ($message.ToCharArray() | Where-Object { $_ -ne '/' }) -join '/'
a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p
PS C:\> $message.Replace("/", "").ToCharArray() -join '/'
a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p
uj5u.com熱心網友回復:
正如Theo/指出的那樣,由于您的意圖是將斜杠 ( )以外的所有單個字符與 分開/,因此您不需要找到現有斜杠的索引,因為該方法可以簡化為:
使用運算子洗掉現有
/實體-replace將結果中的單個字符與
-join運算子連接起來.ToCharArray()使用下面的 .NET 字串方法獲得單個字符的陣列;或者,您可以轉換為[char[]]
# -> 'a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p'
('ab/cde/f/ghijklm/no/p' -replace '/').ToCharArray() -join '/'
也用于在最后一個字符之后(...) '/'放置 a 。或者,考慮 phuclv 的基于正則運算式的解決方案。/
正如zett42指出的那樣,獲取 -0基于字符或子字串位置的最直接方法是使用[regex]::Matches().NET 方法:
# -> 2, 6, 8, 16, 19
[regex]::Matches('ab/cde/f/ghijklm/no/p', '/').Index
請注意,即使方法呼叫回傳多個(一組)匹配資訊物件,.Index也可用于從每個物件中提取索引(位置)值,這得益于 PowerShell 方便的成員訪問列舉功能。
uj5u.com熱心網友回復:
對,所以,這里有 3 種可能性:
第一種可能性
非常簡單(我是錯誤地發現了這一點,我什至不明白它是如何作業的,但無論如何),實際上不需要/! 對此感到抱歉??
$message = "my name is silloky"
[int] $length = $message.Length
[int] $times = 0
[int] $char_num = 1
do{
$message = $message.Insert($char_num,'/')
$char_num = $char_num 2
$times = $times 1
}until($times -eq $length)
$message = $message.replace(' ','')
Write-Output "The slashed output of the message is : $message
第二種可能性
使用@phuclv 極其簡單的代碼,讓我感覺自己像一個完全復雜的人!...
實際上從上面替換了我的([^/])(?!/)do-until 回圈,但它仍然留下了一些空格!
$message = "my name is silloky"
$message $message -replace '([^/])(?!/)', '$1/'
$message = $message.replace(' ','')
Write-Output $message
第三種可能性
搞砸這個,它不必要地復雜......??
結論
順便說一句,我已經測驗了我在這里提供的代碼,但我不能保證......
我想我會采取第一種可能性,因為我應該自己撰寫這段代碼,我真的不在乎我的代碼是否長了 10 行(它讓非編碼人員看起來更酷......)。
但是感謝@phuclv、@mkelement0、@zett42(即使你沒有參與這次談話,你間接地幫助了我)和@Theo 無論如何幫助了我。
無論您正在閱讀本文的人,如果您遇到一種可能性(或者如果我的一個代碼片段不起作用),請隨時在評論中提出另一種可能性!????
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/496665.html
