1

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

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

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 之前是否有零个或多个空格时。(我无法解释,这很复杂。)

4

2 回答 2

1

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

   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();
        }
于 2013-01-31T13:54:43.280 回答
0

如果它只是关于检查模式,而不是实际提取标题名称,让我试一试:

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

如果您确定没有名称将包含“-”并且该字符将名称与剧集信息分开,您可以尝试像这样拆分字符串:

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, "_+", " ")在删除多个空格之前使用。

于 2013-01-31T13:20:11.560 回答