如何在c#中使用正则表达式来匹配带有空格或字符的多个模式

本文关键字:空格 字符 模式 正则表达式 | 更新日期: 2023-09-27 18:12:01

我正在尝试使用regex

将以下模式分解为组
Law & Order Special Victims Unit S05E21 Criminal
Law & Order Special Victims Unit.S05E21.Criminal
Law.&.Order.Special.Victims.Unit.S05E21.Criminal
Law & Order Special Victims Unit - S05E21 - Criminal

我想把它们分解成以下成员

Showname
Season
Episode
Title

我用下面的正则表达式把它分成几组。

(.*)('s+)?(.)('s+)?(S)('d+)(E)('d+)('s+)?(.)('s+)?(.*)/gi

它适用于所有,除了最后一个,它在showname中添加了-,所以而不是

法律,订购特殊受害者单位

for showname (group 1) I'm get

法律,订购特殊受害者小组-

我如何告诉regex,如果有一个空格后面的字符(空格可能是可选的)挑选出字符到一个单独的组?

澄清。名称中的-(分隔符)可能存在,也可能不存在,也可能是其他东西,比如+或_或其他今天未知的东西

如何在c#中使用正则表达式来匹配带有空格或字符的多个模式

我会这样写

(.*?)'s*['.-]?'s*S('d+)E('d+)'s*['.-]?'s*(.*)

第一组捕获showname。* ?捕获非贪婪的,只捕获尽可能少的字符,因此它不捕获分隔符。

然后是可选的分隔符'。'或'-'以及前后可选的空白。

然后是"S数E数"部分。

还是可选分隔符

和带有标题的最后一个组。

我只把有趣的位置作为捕获组,所以你不会得到所有分隔符的垃圾。

可以在字符组中添加更多分隔符。但是这些可能会在showname的末尾和title的开头被捕获。

测试代码:

string[] d = { "Law & Order Special Victims Unit S05E21 Criminal", "Law & Order Special Victims Unit.S05E21.Criminal", "Law.&.Order.Special.Victims.Unit.S05E21.Criminal", "Law & Order Special Victims Unit - S05E21 - Criminal" };
var r = new System.Text.RegularExpressions.Regex(@"(.*?)'s*['.-]?'s*S('d+)E('d+)'s*['.-]?'s*(.*)");
foreach (var v in d)
{
    var match = r.Match(v);
    foreach (var g in match.Groups)
        Console.WriteLine(g);
    Console.WriteLine();
}

编辑

如果您需要任何分隔符,我建议如下:

(.*?)'s*('W)?'s*S('d+)E('d+)'s*('2)'s*(.*)

这里假设分隔符字符是非单词字符,因此希望它不会与标题冲突。它假设一个对称分隔符,所以左右分隔符必须相同。所以它不会捕获以括号结尾的标题或类似的东西。

编辑2

另一种变化:

(.*?)'s*([^A-Za-z0-9])?'s*S('d+)E('d+)'s*'2's*(.*)

因为'_'显然是一个单词字符,所以我自己定义了字符类。新的测试用例现在应该可以工作了。