如何在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,如果有一个空格后面的字符(空格可能是可选的)挑选出字符到一个单独的组?
澄清。名称中的-(分隔符)可能存在,也可能不存在,也可能是其他东西,比如+或_或其他今天未知的东西
我会这样写
(.*?)'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*(.*)
因为'_'显然是一个单词字符,所以我自己定义了字符类。新的测试用例现在应该可以工作了。