簡體   English   中英

使用正則表達式多次匹配組

[英]Match group multiple times with regex

我的目標是從文件名中獲取電視節目的季節和情節。 我有以下正則表達式:

(\d{1,2})([^\d]{1,2}(\d{1,2}))+.*

對於僅包含一集的文件,結果與預期的一樣。 第一組匹配的包含季節編號,第三組包含的情節編號。 但是我對包含多個情節的文件有問題。 它始終僅將一個組與情節(最后一個)匹配,而不是全部。

也許例子勝過千言萬語:

S01E01.HDTV.x264-LOL.mp4       Result: 01, 01
S01E01E02.HDTV.x264-LOL.mp4    Result: 01, 02   Expected: 01, 01, 02
S01E01-02.HDTV.x264-LOL.mp4    Result: 01, 02   Expected: 01, 01, 02
S01E01-E02.HDTV.x264-LOL.mp4   Result: 01, 02   Expected: 01, 01, 02

01x01 Lorem ipsum.avi          Result: 01, 01
01x01-02 Lorem ipsum.avi       Result: 01, 02   Expected: 01, 01, 02

1x1 Lorem ipsum.avi            Result: 1, 1
1x1-2 Lorem ipsum.avi          Result: 1, 2     Expected: 1, 1, 2

交互式示例在這里

我認為,問題是在我的(錯誤的)假設+([^\\d]{1,2}(\\d{1,2}))+將引起多個組相匹配。

順便說一句,我正在使用.NET,但是我想那應該沒關系。

我已修復您的正則表達式以匹配您需要的部分:

(\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?.*

在這種情況下,無需多行選項。

在這里查看我的演示

C#示例代碼:

var rx5 = new Regex(@"(\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?.*");
var results = rx5.Matches(str5).Cast<Match>().Select(p => p.Groups[1].Value + " - " + p.Groups[2].Value + (!String.IsNullOrEmpty(p.Groups[3].Value) ? " - " + p.Groups[3].Value : "")).ToList();

輸出:

在此處輸入圖片說明

我建議使用此正則表達式,但您必須使用.NET來過濾一些無用的匹配項。

([xES]|\b)(\d{1,2})

這將適用於同一行的Season或Episode的靈活數量。

匹配示例:

S01E01E02E03
S01E01E02E03E04
...

但例如,給定:

S01E01E02E03.HDTV.x264-LOL.mp4

這將匹配:01、01、02、03、26

因此,您必須編寫代碼來檢查數字是否連續。

您可以將此正則表達式與MULTILINE標志一起使用:

^\D*(\d{1,2})\D{1,2}(\d{1,2})\D{1,2}(\d{1,2})?

正則演示

從演示中可以看到,它正在生成您所討論的所有預期匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM