function Get-NameRegex {
param (
$Str ,
$Regex ,
$Exclude ,
[switch] $End
)
# 查詢 Regex 字串中定義的 TAG,並將其作為 Scriptblock
$Keyfind = {
process {
if ( $_ -match " \(\?\<(.*?)\> " ) {
$Matches [ 1 ]
} else {
Write-Error " $ _ 沒有定義(?<TAG>) "
}
}
}
#
$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?(?<Episode>\d{2}) "
" [\[\b\s](?<Episode>\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s] "
" \[(?<Episode>\d{1,2})\] "
#"\d"
)
$RS1 = $TestName | % { Get-NameRegex $_ -Regex $Regex }
$RS1
$NameRegex = @ (
" [\[\b\s](?<Name>[^\[\]]*)[\]\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 " $ _ 沒有定義(?<TAG>) "
}
}
}
$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