फूट डालो और राज
आप एक सरल अभिव्यक्ति के साथ बहुत अधिक पार्स करने के लिए कोशिश कर रहे हैं। यह बहुत अच्छी तरह से काम नहीं करेगा। इस मामले में सर्वोत्तम दृष्टिकोण समस्या को छोटी समस्याओं में विभाजित करना है, और प्रत्येक को अलग से हल करना है।फिर, हम सब कुछ बाद में एक पैटर्न में जोड़ सकते हैं।
चलिए उस डेटा के लिए कुछ पैटर्न लिखें जिन्हें आप निकालना चाहते हैं।
सीजन/प्रकरण:
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'
'@" एस (\ घ {1,2}) ई (*।?)? (\ d {1,2}) (। *) | (। *?) एस? (\ डी {1,2}) ई? (\ डी {1,2}) "आपने दो बार एक ही पैटर्न क्यों लिखा ? –
यह एक ही पैटर्न नहीं है। किसी भी पीछे वाले वर्णों के लिए (। *) के साथ एक सिरों को नोटिस करें, जबकि दूसरा नहीं है। मैंने पाया कि अगर मैंने (। *) को तोड़ दिया, तो प्रकरण संख्या के बाद अधिक वर्णों के साथ तारों को पकड़ा नहीं जा रहा था। –
जो मैं कह रहा हूं वह दूसरा भाग है जो पहले भाग का सबसेट है जहां '। *' शून्य अक्षरों से मेल खाता है .. ?? –