我正在嘗試從文本塊中提取特定單詞。塊本身看起來像這樣。
soundeffect = {
name = event_ship_explosion
sounds = {
sound = event_ship_explosion
}
volume = 0.2
max_audible = 1
max_audible_behaviour = fail
}
soundeffect = {
name = event_ship_bridge
sounds = {
sound = event_ship_bridge
sound = event_ship_bridge_02
sound = event_ship_bridge_03
}
volume = 0.3
max_audible = 1
max_audible_behaviour = fail
}
它們非常相似,但主要區別在于在一個sounds塊內,可以有多個sound. 無論是單個還是多個實體sound,我都希望能夠提取所有實體。
基本上,對于每個soundeffect塊,我想提取一對單詞,其中包含右側的內容name = 和右側的內容sound = (多次,如果適用)。
到目前為止,我想出了這個 RegEx,并且在測驗它時(在
正則運算式:name\s*=\s*(?<Group>\w )\s*sounds\s*=\s*{\s*(?>sound\s*=\s*(?<Sound>\w )\s*) }
sound = 但是,在使用 PowerShell 時,僅保留右側的最后一個實體。之前的匹配被覆寫。將所有這些轉換為我可以利用的物件陣列(使用ConvertFrom-Text- https://github.com/jdhitsolutions/PSScriptTools/blob/master/docs/ConvertFrom-Text.md)。如果你采取第二個soundeffect塊,這是我得到的結果:
Group Sound
----- -----
event_ship_bridge event_ship_bridge_03
當我正在尋找類似的東西時:
Group Sound
----- -----
event_ship_bridge @(event_ship_bridge, event_ship_bridge_02, event_ship_bridge_03}
我終于想知道我想做的事情是否甚至可以使用 RegEx 來實作,所以我對你可以給我的所有輸入都很感興趣。:)
編輯:這是我目前使用的 PowerShell 代碼:
$Text | Select-String -Pattern $Regex -AllMatches | ForEach-Object {
[string]$GroupName = $_.Matches.Groups[$Regex.GroupNumberFromName("Group")] | % { $_.Value }
[string]$SoundName = $_.Matches.Groups[$Regex.GroupNumberFromName("Sound")] | % { $_.Value }
}
$GroupName
$SoundName
它回傳以下結果,就好像該-AllMatches引數沒有受到尊重一樣。
event_ship_explosion
event_ship_explosion
uj5u.com熱心網友回復:
您的 PowerShell 代碼中似乎存在三個問題。
由于有多個匹配項,您需要另一個回圈來遍歷所有匹配項。
“聲音”組有多個捕獲,因此您需要查看
Captures成員才能將它們全部檢索。您將結果寫入變數而不是回傳它們。這些變數當然會在回圈的每次迭代中被覆寫,所以在回圈外讀取它們只會給你最后一個值。
嘗試這樣的事情:
PS > $Text | Select-String -Pattern $Regex -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object {
>> [pscustomobject]@{
>> GroupName = $_.Groups[$Regex.GroupNumberFromName("Group")].Value
>> SoundName = $_.Groups[$Regex.GroupNumberFromName("Sound")].Captures.Value
>> }
>> }
>>
GroupName SoundName
--------- ---------
event_ship_explosion event_ship_explosion
event_ship_bridge {event_ship_bridge, event_ship_bridge_02, event_ship_bridge_03}
uj5u.com熱心網友回復:
一種略有不同的方法(我對powershell很陌生):
$txt = Get-Content('./soundeffect.txt')
$txt |
select-String -Pattern "name =.*|sound =.*" |
ForEach-Object { $a = $_.Line.Trim().Split("=");
if($a[0].Trim() -eq "name") { $soundeffect=$a[1].Trim() }
if($a[0].Trim() -eq "sound") {
$sound=$a[1].Trim()
"$soundeffect, $sound"
}
$sound = ""
}
輸出:
event_ship_explosion, event_ship_explosion
event_ship_bridge, event_ship_bridge
event_ship_bridge, event_ship_bridge_02
event_ship_bridge, event_ship_bridge_03
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523418.html
標籤:正则表达式电源外壳
