function Get-NameRegex { param( $Str, $Regex, $Exclude, [switch] $End ) # 查詢 Regex 字串中定義的 TAG,並將其作為 Scriptblock $Keyfind = { process{ if ($_ -match "\(\?\<(.*?)\>") { $Matches[1] } else { Write-Error "$_ 沒有定義(?)" } } } # $InnerScrip = { # 取用管線傳入的 hash 進行 match process { $Key = $_["Regex"] | &$Keyfind if ($_["Target"] -match $_["Regex"]) { $Result = @{ $Key = $Matches[$Key] # 將錨定字串中的特殊字元轉換為一般字串 Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' } $LR = $_["Target"] -split $Result["Anchor"] $Result.Add("L", $LR[0]) $Result.Add("R", $LR[1]) # 對 Anchor 結果,以 $Exclude 進行比對,符合則加入剩餘字串重新 match if ($Exclude -and($Result["Anchor"] -match $Exclude)) { $Result.Add("Regex", $_["Regex"]) $Result.Add("Target", $Result["L"]) return $Result | &$InnerScrip } # 結尾模式,僅輸出符合 TAGKEY 的 hash if ($End) { return @{ $Key = $Result[$Key] } } else { return $Result } } } } Write-Host $Str # Regex 可輸入複數個 $Regex | % { @{ Target = $Str; Regex = $_; } } | &$InnerScrip } $Pathes = @( "L:\Anime\201110 WORKING’!!\[#CHAT RUMBLE#][WORKING’!!][01-13 END][BIG5][x264_aac][1280x720]\[#CHAT RUMBLE#][WORKING’!!][13][BIG5][x264_aac][1280x720][11C6E807].mp4" "L:\Anime\200910 にゃんこい!(貓願三角戀)\[DMG][Nyan Koi!][01-12 END][848x480][BIG5]\[DMG][Nyan Koi!][12 end][848x480][BIG5].rmvb" "L:\Anime\200910 聖剣の刀鍛冶(聖劍鍛造師)\[DMG][The Sacred Blacksmith][01-12 END][848x480][BIG5]\[DMG][The Sacred Blacksmith][04V2][848x480][BIG5].rmvb" "L:\Anime\201104 星空へ架かる橋(架向星空之橋)\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][Vol.01][1920x1080][TW_BIG5][x264_FLAC]\[AngelSub][Hoshizora e Kakaru Hashi][BDRip][01][1920x1080][BIG5][x264_FLAC].mkv" "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" "L:\Anime\202004 ストライク・ザ・ブラッド OVA IV\[Suzu-Kaze][Strike_the_Blood_IV_OVA][01-12FIN][BDRip_1080P][HEVC_YUV420P10]\[Suzu-Kaze] Strike the Blood IV 12FIN [BDRip 1920x1080 HEVC YUV420P10 FLAC].mkv" "L:\Anime\200910 アスラクライン II(機巧魔神)\[DMG][Asura Cryin2][01-13 END][848x480][BIG5][RMVB]\[DMG][Asura Cryin 2][01][848x480][Big5].rmvb" "H:\Data\Downloads\異世界食堂\[Lilith-Raws] Isekai Shokudou S02 - 06 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4" ) $TestName = @($Pathes | % {$_.Split("\\")[-1]}) $Str = $TestName[3] $Regex = @( "S\d{2}[\s\-]+E?(?\d{2})" "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" "\[(?\d{1,2})\]" #"\d" ) $RS1 = $TestName | % { Get-NameRegex $_ -Regex $Regex } $RS1 $NameRegex = @( "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" ) $RS1 | % { Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End } $TestName | % { Get-NameRegex $_ -Regex $Regex } $TestName | % { Get-NameRegex $_ -Regex $Regex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End) + $_ } $D1 = $Str | % { Get-NameRegex $_ -Regex $Regex } $Keyfind = { process{ if ($_ -match "\(\?\<(.*?)\>") { $Matches[1] } else { Write-Error "$_ 沒有定義(?)" } } } $InterSB2 = { # 取用管線傳入的 hash 進行 match process { if (-not($Key)) { $Key = $_["Regex"] | &$Keyfind } if ($_["Target"] -match $_["Regex"]) { $Result = @{ $Key = $Matches[$Key] # 將錨定字串中的特殊字元轉換為一般字串 Anchor = $Matches[0] -replace "([\[\]\(\)])", '\$1' } $LR = $_["Target"] -split $Result["Anchor"] $Result.Add("L", $LR[0]) $Result.Add("R", $LR[1]) # 對 Matches 結果,比對 $Exclude if ($Result["Anchor"] -match $Exclude) { $Result.Add("Regex", $_["Regex"]) $Result.Add("Target", $Result["L"]) return $Result | &$InterSB2 } $Result }} } $D2 = @{ Target = $D1["L"] Regex = $NameRegex[0] Exclude = "BDrip" } $D2 $eeww = @("Exclude", "Key") $D2.Remove($eeww) $eeww | % { $D2.Remove($_) } $D2["Target"] $wee = $D2["Regex"] | &$Keyfind $Exclude = "1" $D2["Target"] $D2 | &$InterSB2