使用RegEx从字符串中提取标题

时间:2013-01-31 12:36:30

标签: c# regex

我遇到的问题是必须从小块的字符串中提取程序的标题,而这些字符串的结构根本无法预测。您可以在下面看到一些模式,并且必须对每个字符串进行评估以查看它是否与这些结构中的任何一个匹配,以使我能够正确获取标题。

我已经购买了Mastering正则表达式,但是我必须完成这项工作的时间不允许我学习这本书并尝试对这个(有趣但特别的)主题进行必要的介绍。

Perharps,在这方面有经验的人可以帮助我理解如何完成这项工作吗?

Some random Name 2 - Ep.1   
=> Some random Name 2

Some random Name - Ep.1 
=> Some random Name

Boff another 2 name! - Ep. 228 
=> Boff another 2 name!     

Another one & the rest - T1 Ep. 2 
=>Another one & the rest

T5 - Ep. 2 Another Name     
=> Another Name 

T3 - Ep. 3 - One More with an Hyfen  
=> One More with an Hyfen

Another one this time with a Date - 02/12/2012   
=>Another one this time with a Date

10 Aug 2012 - Some Other 2 - Ep. 2 
=> Some Other 2

Ep. 93 -  Some program name
=> Some Program name    
Someother random name - Epis. 1 e 2
=> Someother random name

The Last one with something inside parenthesis (V.O.)
=> The Last one with something inside parenthesis

正如您可能会看到我想从给定字符串中提取的标题可能包含数字,特殊字符(如&)和a-zA-Z中的字符(我猜这就是全部)

复杂的部分来自于必须知道标题后面是否有一个空格或更多空格,后面跟一个连字符,如果它在Ep之前有零个或多个空格。 (我无法解释这一点,这很复杂。)

2 个答案:

答案 0 :(得分:1)

该程序将处理您的案件。主要原则是如果存在于字符串的beginnign或end中,它将删除某个序列。如果要删除的字符串格式将根据需要更改或更改它们的顺序,则必须维护正则表达式列表。

   using System;
   using System.Text.RegularExpressions;

    public class MyClass
    {


        static string [] strs = 
        {       
               "Some random Name 2 - Ep.1",
               "Some random Name - Ep.1",
               "Boff another 2 name! - Ep. 228",
               "Another one & the rest - T1 Ep. 2",
               "T5 - Ep. 2 Another Name",
               "T3 - Ep. 3 - One More with an Hyfen",
               @"Another one this time with a Date - 02/12/2012",
               "10 Aug 2012 - Some Other 2 - Ep. 2",
               "Ep. 93 -  Some program name",
               "Someother random name - Epis. 1 e 2",
               "The Last one with something inside parenthesis (V.O.)"};

        static string [] regexes = 
        {
            @"T\d+",
            @"\-",
            @"Ep(i(s(o(d(e)?)?)?)?)?\s*\.?\s*\d+(\s*e\s*\d+)*",
            @"\d{2}\/\d{2}\/\d{2,4}",
            @"\d{2}\s*[A-Z]{3}\s*\d{4}",
            @"T\d+",
            @"\-",
            @"\!",
            @"\(.+\)",
        };

        public static void Main()
        {
            foreach(var str in strs)
            {
                string cleaned = str.Trim();
                foreach(var cleaner in regexes)
                {
                    cleaned = Regex.Replace(cleaned, "^" + cleaner, string.Empty, RegexOptions.IgnoreCase).Trim();  
                    cleaned = Regex.Replace(cleaned, cleaner + "$", string.Empty, RegexOptions.IgnoreCase).Trim();
                }
                Console.WriteLine(cleaned);
            }
            Console.ReadKey();
        }

答案 1 :(得分:0)

如果仅仅是检查模式,而不是实际提取标题名称,那就让我去吧:

使用@"Ep(is)?\.?\s*\d+",您可以检查“Ep1”,“Ep01”,“Ep.999”,“Ep3”,“Epis.0”,“Ep 11”等类似的字符串(它还可以检测到Ep和数字之间的多个空格。 如果您想匹配“ep1”以及“Ep1”或“EP1”,您可能需要使用RegexOptions.IgnoreCase

如果您确定,没有名称将包含“ - ”,并且此字符将名称与episode-info分开,您可以尝试将字符串拆分为:

string[] splitString = inputString.Split(new char[] {'-'});
foreach (string s in splitString)
{
    s.Trim() // removes all leading or trailing whitespaces
}

您可以在splitString[0]splitString[1]中使用该名称,在另一个中使用剧集信息。

要搜索日期,您可以使用:@"\d{1,4}(\\|/|.|,)\d{1,2}(\\|/|.|,)\d{1,4}"可以检测前面或后面写有1到4位小数的日期(中心值除外,可以是1到2)小数点长)并用反斜杠,斜杠,逗号或点分隔。

就像我之前提到的:这将不允许你的程序提取实际的标题,只是为了找出这些字符串是否存在(这些字符串可能仍然是标题本身的一部分)

修改

摆脱多个空格的一种方法是使用inputString = Regex.Replace(inputString, "\s+", " "),用一个空格替换多个空格。也许你有下划线而不是空格?例如:“This_is_a_name”,在这种情况下,您可能希望在删除多个空格之前使用inputString = Regex.Replace(inputString, "_+", " ")