Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用正则表达式多次匹配组_.net_Regex - Fatal编程技术网

.net 使用正则表达式多次匹配组

.net 使用正则表达式多次匹配组,.net,regex,.net,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 Exp

我的目标是从文件名中获得一个电视节目的季和集。我有以下正则表达式:

(\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})
这将适用于同一线路上灵活的季数或集数

匹配示例:

S01E01E02E03
S01E01E02E03E04
...
但例如:

S01E01E02E03.HDTV.x264-LOL.mp4
这将匹配: 01,01,02,03,26


因此,您必须编写代码来检查数字是否连续。

是的,这适用于我在这里编写的示例。但我可能没有非常具体地说明剧集数。虽然很少见,但可能会有名为S01E02E03的文件。因此,我想要的东西可以匹配任意数量的集。我不确定你到底想要匹配什么:\d{1,2}[^\d]{1,2}\d{1,2}?:[^\d]{1,2}\d{1,2}?*还包括S01E02E03:它得到01,02,03。看见或者您还想匹配表示剧集的字母吗?哪一个?如果您不提供您所有的数据、确切的所需输出格式,我们将无法更好地帮助您。我想我确实回答了你的问题,是这样说的,不是那样说的。哦,很抱歉搞混了。我在先前的评论中犯了一个错误。应该有S01E01E02E03。我知道我可以调整你的正则表达式与另一组,以涵盖甚至3集。但我想知道是否有一种方法可以使它独立于剧集的数量。另外,我不需要匹配字母,只需要匹配数字。我想我可以用另一种方法来匹配,但现在,我认为您可以添加另一个可选组:\d{1,2}[^\d]{1,2}\d{1,2}:[^\d]{1,2}\d{1,2}:[^\d]{1,2}.*。另一个解决方案需要更多的代码编写,正则表达式是其中最不重要的部分。