2015-05-23 10 views
5

सी # रेगेक्स का उपयोग करके स्ट्रिंग से पार्स किए गए डेटा को मिलान और वापस करने के अविश्वसनीय परिणाम लौटा रहे हैं।रेगेक्स पैटर्न कुछ शो शीर्षक से मेल नहीं खाता

Regex r=new Regex( 
     @"(.*?)S?(\d{1,2})E?(\d{1,2})(.*)|(.*?)S?(\d{1,2})E?(\d{1,2})", 
     RegexOptions.IgnoreCase 
); 

के बाद एक जोड़ी परीक्षण मामलों है कि असफल


Ellen 2015.05.22 Joseph Gordon Levitt [REPOST] 
The Soup 2015.05.22 [mp4] 
Big Brother UK Live From The House (May 22, 2015) 

लौट चाहिए

  • दिखाएँ नाम हैं:

    पैटर्न मैं उपयोग कर रहा हूँ इस प्रकार है (जैसे, Ellen)

  • तिथि (जैसे, 2015.05.22)
  • अतिरिक्त जानकारी (जैसे, Joseph Gordon Levitt [REPOST])

Alaskan Bush People S02 Wild Times Special 

लौट चाहिए

  • शो का नाम (जैसे, Alaskan Bush People)
  • सीजन (उदाहरण के लिए, 02)
  • अतिरिक्त जानकारी (जैसे, Wild Times Special)

500 Questions S01E03 

लौट चाहिए

  • शो का नाम (जैसे, 500 Questions)
  • सीजन (जैसे, 01)
  • एपिसोड (उदाहरण के लिए, 03)

उदाहरणों में काम करते हैं और उचित डेटा वापस

Boyster S01E13 – E14 
Mysteries at the Museum S08E08 
Mysteries at the National Parks S01E07 – E08 
The Last Days Of… S01E06 
Born Naughty? S01E02 
Have I Got News For You S49E07 

यह की तरह लगता है क्या, उस पैटर्न एस और ई अनदेखी कर रहा है, तो नहीं मिला, और फिर पहले उपयोग कर रहा है उस स्लॉट को भरने के लिए मिलान संख्याओं का सेट।

यह स्पष्ट है कि उपरोक्त भिन्न तारों के साथ काम करने के लिए इस पैटर्न पर और अधिक काम की आवश्यकता है। इस मामले में आपकी सहायता बहुत सराहना की है।

+0

'@" एस (\ घ {1,2}) ई (*।?)? (\ d {1,2}) (। *) | (। *?) एस? (\ डी {1,2}) ई? (\ डी {1,2}) "आपने दो बार एक ही पैटर्न क्यों लिखा ? –

+0

यह एक ही पैटर्न नहीं है। किसी भी पीछे वाले वर्णों के लिए (। *) के साथ एक सिरों को नोटिस करें, जबकि दूसरा नहीं है। मैंने पाया कि अगर मैंने (। *) को तोड़ दिया, तो प्रकरण संख्या के बाद अधिक वर्णों के साथ तारों को पकड़ा नहीं जा रहा था। –

+0

जो मैं कह रहा हूं वह दूसरा भाग है जो पहले भाग का सबसेट है जहां '। *' शून्य अक्षरों से मेल खाता है .. ?? –

उत्तर

5

फूट डालो और राज

आप एक सरल अभिव्यक्ति के साथ बहुत अधिक पार्स करने के लिए कोशिश कर रहे हैं। यह बहुत अच्छी तरह से काम नहीं करेगा। इस मामले में सर्वोत्तम दृष्टिकोण समस्या को छोटी समस्याओं में विभाजित करना है, और प्रत्येक को अलग से हल करना है।फिर, हम सब कुछ बाद में एक पैटर्न में जोड़ सकते हैं।

चलिए उस डेटा के लिए कुछ पैटर्न लिखें जिन्हें आप निकालना चाहते हैं।

  • सीजन/प्रकरण:

    S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)? 
    

    मैं - के बजाय \p{Pd} वाली किसी भी पानी का छींटा प्रकार के लिए समायोजित करने के लिए।

  • दिनांक:

    \d{4}\.\d{1,2}\.\d{1,2} 
    

    या ...

    (?i:January|February|March|April|May|June|July|August|September|October|November|December) 
    \s*\d{1,2},\s*\d{4} 
    
  • अतिरिक्त जानकारी के लिए एक सरल पद्धति लिखें:

    .*? 
    

    (हाँ, यह बहुत सामान्य है)

  • हम भी इस तरह शो प्रारूप का पता लगाने कर सकते हैं:

    \[.*?\] 
    
  • आप अतिरिक्त भागों के रूप में आवश्यक जोड़ सकते हैं।

अब, हम एक पैटर्न में सब कुछ डाल सकते हैं, डेटा निकालने के समूह के नाम का उपयोग करते हुए:

^\s* 
(?<name>.*?) 
(?<info> \s+ (?: 
    (?<episode>S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)?) 
    | 
    (?<date>\d{4}\.\d{1,2}\.\d{1,2}) 
    | 
    \(?(?<date>(?i:January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{1,2},\s*\d{4})\)? 
    | 
    \[(?<format>.*?)\] 
    | 
    (?<extra>(?(info)|(?!)).*?) 
))* 
\s*$ 

बस (यह extra में सशर्त के लिए प्रयोग किया जाता है info समूह की अनदेखी, ताकि extra नहीं करता ' टी का उपभोग करें कि शो नाम का हिस्सा क्या होना चाहिए)। और आप कई extra इंफोस प्राप्त कर सकते हैं, इसलिए बस प्रत्येक भाग के बीच एक जगह डालने, उन्हें संयोजित करें।

नमूना कोड:

var inputData = new[] 
{ 
    "Boyster S01E13 – E14", 
    "Mysteries at the Museum S08E08", 
    "Mysteries at the National Parks S01E07 – E08", 
    "The Last Days Of… S01E06", 
    "Born Naughty? S01E02", 
    "Have I Got News For You S49E07", 
    "Ellen 2015.05.22 Joseph Gordon Levitt [REPOST]", 
    "The Soup 2015.05.22 [mp4]", 
    "Big Brother UK Live From The House (May 22, 2015)", 
    "Alaskan Bush People S02 Wild Times Special", 
    "500 Questions S01E03" 
}; 

var re = new Regex(@" 
    ^\s* 
    (?<name>.*?) 
    (?<info> \s+ (?: 
     (?<episode>S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)?) 
     | 
     (?<date>\d{4}\.\d{1,2}\.\d{1,2}) 
     | 
     \(?(?<date>(?i:January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{1,2},\s*\d{4})\)? 
     | 
     \[(?<format>.*?)\] 
     | 
     (?<extra>(?(info)|(?!)).*?) 
    ))* 
    \s*$ 
", RegexOptions.IgnorePatternWhitespace); 

foreach (var input in inputData) 
{ 
    Console.WriteLine(); 
    Console.WriteLine("--- {0} ---", input); 

    var match = re.Match(input); 
    if (!match.Success) 
    { 
     Console.WriteLine("FAIL"); 
     continue; 
    } 

    foreach (var groupName in re.GetGroupNames()) 
    { 
     if (groupName == "0" || groupName == "info") 
      continue; 

     var group = match.Groups[groupName]; 
     if (!group.Success) 
      continue; 

     foreach (Capture capture in group.Captures) 
      Console.WriteLine("{0}: '{1}'", groupName, capture.Value); 
    } 
} 

और यह है के उत्पादन में ...

--- Boyster S01E13 - E14 --- 
name: 'Boyster' 
episode: 'S01E13 - E14' 

--- Mysteries at the Museum S08E08 --- 
name: 'Mysteries at the Museum' 
episode: 'S08E08' 

--- Mysteries at the National Parks S01E07 - E08 --- 
name: 'Mysteries at the National Parks' 
episode: 'S01E07 - E08' 

--- The Last Days Ofâ?¦ S01E06 --- 
name: 'The Last Days Ofâ?¦' 
episode: 'S01E06' 

--- Born Naughty? S01E02 --- 
name: 'Born Naughty?' 
episode: 'S01E02' 

--- Have I Got News For You S49E07 --- 
name: 'Have I Got News For You' 
episode: 'S49E07' 

--- Ellen 2015.05.22 Joseph Gordon Levitt [REPOST] --- 
name: 'Ellen' 
date: '2015.05.22' 
format: 'REPOST' 
extra: 'Joseph' 
extra: 'Gordon' 
extra: 'Levitt' 

--- The Soup 2015.05.22 [mp4] --- 
name: 'The Soup' 
date: '2015.05.22' 
format: 'mp4' 

--- Big Brother UK Live From The House (May 22, 2015) --- 
name: 'Big Brother UK Live From The House' 
date: 'May 22, 2015' 

--- Alaskan Bush People S02 Wild Times Special --- 
name: 'Alaskan Bush People' 
episode: 'S02' 
extra: 'Wild' 
extra: 'Times' 
extra: 'Special' 

--- 500 Questions S01E03 --- 
name: '500 Questions' 
episode: 'S01E03' 
+0

इसका परीक्षण करेगा। Ty। –

+0

प्रश्न में उपर्युक्त जानकारी के आधार पर आपको जो चाहिए वह लौटा। मुझे एक और सामना करना पड़ा जो शायद आप हल कर सकते हैं (और इससे मुझे समूह को बेहतर समझने में मदद मिलेगी) >> 'जिमी फलन 2015 05 22 स्टिंग और केविन कॉनॉली'। मैंने इस तिथि के लिए एक विकल्प जोड़ने की कोशिश की, लेकिन सुनिश्चित नहीं है :) –

+0

निश्चित रूप से, आप बस जोड़ सकते हैं: '(? \ d {4} [] \ d {1,2} [] \ d {1,2}) 'या' (? \ d {4} \ s \ d {1,2} \ s \ d {1,2}) ', या शायद' (? \ d {4} \। \ d {1,2} \। \ D {1,2}) 'से' (? \ d {4} [।] \ D {1,2} [।] \ D {1,2}) 'लेकिन वह अंतिम विकल्प '2015 05.22' भी स्वीकार करेगा - आप सबसे अच्छा संस्करण चुनते हैं। –

1

इस प्रयास करें:

(?<name>.*?)(?:S(?<season>\d{1,2}))?(?:E(?<episode>\d{1,2}))?(?<date>\d{4}\.\d{2}\.\d{2})(?<extra>.*)? 
+0

यह एक शॉट दे देगा। Ty। –

+0

इस विधि ने उचित परिणाम नहीं लौटाए।प्रयास के लिए धन्यवाद;) –

संबंधित मुद्दे