1

構造がまったく予測できない小さな文字列からプログラムのタイトルを抽出しなければならないという問題に直面しています。以下に示すようなパターンがいくつかあります。タイトルを正しく取得できるようにするには、各文字列を評価して、それらの構造のいずれかに一致するかどうかを確認する必要があります。

正規表現の習得を購入しましたが、これを達成するために必要な時間では、本を勉強して、この(興味深いが特定の)テーマの必要な紹介を取得しようとすることができません。

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の文字が含まれている可能性があります(これですべてだと思います)

複雑な部分は、タイトルの後に1つ以上のスペースがあり、その後にハイフンが続くかどうか、およびEpまで0以上のスペースがあるかどうかを知る必要がある場合に発生します。(私はこれを説明することはできません、それはただ複雑です。)

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

パターンをチェックするだけで、実際にタイトル名を抽出するのではない場合は、試してみましょう。

「Ep1」、「 Ep01 @"Ep(is)?\.?\s*\d+"」、「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 に答える