5

私は自分用に小さなアプリを作成しています。パターンに一致する文字列を見つけたいのですが、正しい正規表現が見つかりませんでした。

Stargate.SG-1.S01E08.iNT.DVDRip.XviD-LOCK.avi

それは私が持っている文字列の例であり、各数字が最大2桁の長さのS [NUMBER] E [NUMBER]の部分文字列が含まれているかどうかだけを知りたいです。

手がかりを教えてもらえますか?

4

5 に答える 5

10

正規表現

名前付きグループを使用した正規表現は次のとおりです

S(?<season>\d{1,2})E(?<episode>\d{1,2})

使用法

次に、次のように名前付きグループ(シーズンとエピソード)を取得できます。

string sample = "Stargate.SG-1.S01E08.iNT.DVDRip.XviD-LOCK.avi";
Regex  regex  = new Regex(@"S(?<season>\d{1,2})E(?<episode>\d{1,2})");

Match match = regex.Match(sample);
if (match.Success)
{
    string season  = match.Groups["season"].Value;
    string episode = match.Groups["episode"].Value;
    Console.WriteLine("Season: " + season + ", Episode: " + episode);
}
else
{
    Console.WriteLine("No match!");
}

正規表現の説明

S                // match 'S'
(                // start of a capture group
    ?<season>    // name of the capture group: season
    \d{1,2}      // match 1 to 2 digits
)                // end of the capture group
E                // match 'E'
(                // start of a capture group
    ?<episode>   // name of the capture group: episode
    \d{1,2}      // match 1 to 2 digits
)                // end of the capture group
于 2012-08-23T07:12:30.783 に答える
2

ここに素晴らしいオンライン テスト サイトがあります: http://gskinner.com/RegExr/

それを使用すると、必要な正規表現は次のとおりです。

S\d\dE\d\d

しかし、それ以外にもたくさんの凝ったトリックを行うことができます!

于 2012-08-22T23:05:50.597 に答える
0

XBMC のようなメディア ソフトウェアのいくつかを見てみましょう。それらはすべて、テレビ番組用の非常に堅牢な正規表現フィルターを備えています。

ここここを参照

于 2012-08-22T23:08:14.477 に答える
0

もう少し複雑な正規表現を提案したいと思います。「. : - _」はスペースに置き換えているため、ありません

str_replace(
        array('.', ':', '-', '_', '(', ')'), ' ',

これは、タイトルをタイトル シーズンとエピソードに分割するキャプチャ正規表現です。

(.*)\s(?:s?|se)(\d+)\s?(?:e|x|ep)\s?(\d+)

例: ダ・ヴィンチの悪魔 se02ep04 とその亜種 https://regex101.com/r/UKWzLr/3

カバーできない唯一のケースは、季節と数字の間に間隔があることです。タイトルがうまくいかない場合、文字 s または se が一部になるためです。いずれにせよ、そのようなケースは見たことがありませんが、それでも問題です。

編集:2行目でなんとか回避できました

    $title = $matches[1];
    $title = preg_replace('/(\ss|\sse)$/i', '', $title);

このようにして、名前がシリーズの一部である場合、「s」と「se」の末尾を削除します

于 2020-03-25T09:27:47.290 に答える
0

S[NUMBER1]E[NUMBER2] に入れる正規表現は

S(\d\d?)E(\d\d?)       // (\d\d?) means one or two digit

<matchresult>.group(1)で NUMBER1 、 で NUMBER2を取得できます<matchresult>.group(2)

于 2012-08-23T04:49:56.343 に答える