0

右側から始まる文字列内のどの種類の括弧にも含まれていない最初の数字に一致する単一の正規表現を探しています。これは可能ですか?

サンプルテキスト:

[X-Y] Prelude of 2013 - 06 - From the darkness [FLAC 1080p][E0ECC01D].mkv
c:\Files\Prelude 2013[X-Y] Prelude of 2013 - 12 - From the darkness [FLAC 1080p][E0ECC01D].mkv
c:\Programm Files\Yamato 2199[M-L]Space Battleship Yamato 2199 - 09 - Mechanischer Gefangener [FLAC 1080p BD][19066E4A].mkv

各行のそれぞれの期待される結果

06
12
09
4

2 に答える 2

2

次のようなパターンを使用できます。

ruby (php でも動作します):

(?>(?<s>\[(?>[^\]\[]++|\g<s>)*+\])|(?<p>\((?>[^()]++|\g<p>)*+\))|(?<c>\{(?>[^{}]++|\g<c>)*+\})|[^\d\[\](){}]++|(?<n>\d++))++

php:

~(?>(\[(?>[^][]++|(?1))*+])|(\((?>[^)(]++|(?2))*+\))|(\{(?>[^}{]++|(?3))*+\})|[^][)(}{\d]++|(?<n>\d++))++~

。ネット:

(?>(\[(?>[^\]\[]+|(\k<1>))*\])|(\((?>[^)(]+|(\k<2>))*\))|(\{(?>[^}{]+|(\k<3>))*\})|[^\]\[)(}{\d]+|(?<n>\d+))+

これらのパターンは、ネストされたブラケットと壊れた構造を処理できます。PHP の例:

<?php
$subjects = array(
    "[X-Y] Prelude of 2013 - 06 - From the darkness [FLAC 1080p][E0ECC01D].mkv",
    "c:\Programm Files\Yamato 2199[M-L]Space Battleship Yamato 2199 - 09 - Mechanischer Gefangener [FLAC 1080p BD][19066E4A].mkv",
    "c:\Programm Files\Yam{ato 2195[M-L]Space} Bat{tlesh}ip Yamato (2[19)(9] - (09 10)) - Mechanischer Gefangener [FLAC 1080p BD][19066E4A][.mkv",
    "name 34 [more(]stuff).avi",
    "name 34 [[more]stuff].mkv");
$pattern = '~(?>(\[(?>[^][]++|(?1))*+])|(\((?>[^)(]++|(?2))*+\))|(\{(?>[^}{]++|(?3))*+\})|[^][)(}{\d]++|(?<n>\d++))++~';
?><pre><?php

foreach ($subjects as $subject) {
    preg_match($pattern, $subject, $match);    
    echo (isset($match['n'])) ? $match['n'] : 'no match';
    echo '<br/>';
}

説明:

すべての量指定子は所有格であり、パフォーマンスを向上させるための捕捉グループを除いて、すべてのグループはアトミックです。

アイデアは、数字のキャプチャ グループを含むパターン (最初のアトミック グループ内) を可能な限り繰り返すことです。パターンが失敗するまで、発生するたびに古いキャプチャ結果が新しい結果で上書きされます。したがって、最後の番号を取得します。

繰り返されるグループ内では、さまざまな可能性の代替を見つけることができます。

最初の 3 つは、さまざまな種類の中括弧、つまり : [](){} およびネストされた構造を扱う場合と同じです。

(\[(?>[^][]++|(?1))*+])
(\((?>[^)(]++|(?2))*+\))
(\{(?>[^}{]++|(?3))*+\})

角かっこの詳細:

(              #begin capturing group 1
  \[           # opening square bracket
  (?>           # begin atomic group
      [^][]++    # all characters that are not square brackets one or more times
    |           # OR
      (?1)       # repeat the capturing group 1
  )*+           # repeat the atomic group zero or more times
  ]            # closing square bracket
)              #end capturing group 1

最後の 2 つの交代:

-他のオルタネーションを結合するのに便利:

[^][)(}{\d]++ # all characters that are not braces or digits one or more times

-数字:(?<n>\d++)名前付きキャプチャ グループ n 内

于 2013-06-01T17:36:13.563 に答える
0

説明

括弧で囲まれたすべてのテキストが単一のネストされており、開き括弧と閉じ括弧が一致している場合、入力文字列を取得して、最初に括弧で囲まれたすべてのテキストを削除してから、単純な正規表現を適用して最後の桁の値を解析できます。

かっこで囲まれたテキストを削除するには、次を使用できます。\[[^\]]*?\]|\([^)]*?\)|\{[^}]*?\}|\<[^>]*?\>

ここに画像の説明を入力

残りの文字列の最後の数字を解析するには: .*\D(\d+). これは、数字以外の文字が続く数字の最後のセットを探します。一致が成功した場合、グループ 1 には一致のすべての数字が含まれます。

ここに画像の説明を入力

言語をリストしていないので、ここでは単に powershell を使用して、ロジックと、これらがどのように連携するかを示しています。

$string = 'c:\Programm Files\Yamato 2198[M-L]Space Battleship Yamato 2199 - 09 - Mechanischer Gefangener [FLAC 1080p BD][19066E4A].mkv'
write-host "Input String: '$string'"
$string = $String -replace '\[[^\]]*?\]|\([^)]*?\)|\{[^}]*?\}|\<[^>]*?\>', ""
write-host "No Brackets: '$string'"
if ($string -match '.*\D(\d+)') {
    Write-Host "found the following matches"
    $Matches
    } else {
    Write-Host "no matches found"
    } # end if

収量

Input String: 'c:\Programm Files\Yamato 2198[M-L]Space Battleship Yamato 2199 - 09 - Mechanischer Gefangener [FLAC 1080p BD][19066E4A].mkv'
No Brackets: 'c:\Programm Files\Yamato 2198Space Battleship Yamato 2199 - 09 - Mechanischer Gefangener .mkv'
found the following matches

Name                           Value                                                                                                                      
----                           -----                                                                                                                      
1                              09                                                                                                                         
0                              c:\Programm Files\Yamato 2198Space Battleship Yamato 2199 - 09                                                             
于 2013-06-02T01:19:32.317 に答える