2009-04-07 19 views
5

सी #, .NET 3.5सी # में एक स्ट्रिंग पार्सिंग; क्या एक क्लीनर तरीका है?

यह सिर्फ बदसूरत की बदबू आ रही है, लेकिन मैं किसी अन्य तरीके से नहीं सोच सकता।

"जो स्मिथ (जेस्मिथ)" (सैन्स उद्धरण) के प्रारूप के साथ एक स्ट्रिंग को देखते हुए, मैं केवल 'जेस्मिथ' स्ट्रिंग को ब्रांड्स के भीतर पार्स करना चाहता हूं।

private static string DecipherUserName(string user) 
{ 
    if(!user.Contains("(")) 
     return user; 

    int start = user.IndexOf("("); 

    return user.Substring(start).Replace("(", string.Empty).Replace(")", string.Empty); 
} 

मेरी (अन) रेगुलर एक्सप्रेशन से करने के लिए स्वस्थ घृणा के अलावा,-स्ट्रिंग को पार्स आउट का एक सरल तरीका है: मैं इस के साथ आ गया है?

संपादित करें: स्पष्ट करने के लिए, स्ट्रिंग पार्स करने में हमेशा के लिए किया जाएगा: "जो स्मिथ (jsmith)" (बिना उद्धरण)।

उत्तर

9

आप की जरूरत नहीं होनी चाहिए मिल रहा है बस "(" स्थिति के लिए 1 जोड़ सकते हैं। एक हैक के

private static string DecipherUserName (string user) {   
    int start = user.IndexOf("("); 
    if (start == -1) 
     return user; 
    return user.Substring (start+1).Replace(")", string.Empty); 
} 
+0

ध्यान दें: मैंने रेगेक्स समाधान पर पैक्स द्वारा रिफैक्टर को स्वीकार किया है, क्योंकि मुझे लंबे समय तक लगता है, यह तब तक अधिक रखरखाव योग्य होगा जब तक कि मैं RegEx में अधिक जानकारी नहीं लेता। उस, और 1000 नामों के त्वरित परीक्षण में .0077423 एमएस पर .1165195 एमएस बनाम स्ट्रिंग समाधान पर RegEx समाधान था। –

+0

इस तरह के एक साधारण पाठ मैच के लिए, आरईएस आमतौर पर धीमे होते हैं (हालांकि उन्हें लूप में अतिरिक्त गति के लिए एक बार संकलित किया जा सकता है)। उनका वास्तविक लाभ अधिक जटिल मामलों के लिए उनकी अभिव्यक्ति के साथ आता है (उदाहरण के लिए, कोष्ठक के अंदर रिक्त स्थान को अनुमति देना और निकालना)। बहुत सीखने लायक है, तो इसे जारी रखें। – paxdiablo

2

के बाद से indexOf समारोह वापस आ जाएगी -1 जब मूल्य मौजूद नहीं है, आप चीजों को थोड़ा अलग कर सकता है ...

private static string DecipherUserName(string user) 
{   
    int start = user.IndexOf("("); 

    if (start > -1) 
    { 
     return user.Substring(start).Replace("(", string.Empty).Replace(")", string.Empty); 
    } 
    else 
    { 
     return user; 
    } 
} 
+0

भूल गए कि इंडेक्सऑफ -1 वापस आ जाएगा जब मान मौजूद नहीं है। धन्यवाद! Regex के लिए –

20

regexes इतना उपयोगी है कि आप अपने आप को गहन खिन्नता की बचत हो जाएगा रहे हैं बुलेट काटने और उन्हें सीखना। पूरे शेबांग नहीं, बस मूल बातें।

एक रेगेक्स जो काम करेगा "\ w + \ ((। *) \)" - जेस्मिथ मैच में होगा। समूह [1]।

एक आसान तरीका regexes लेने के लिए पहले आप के बाद से की जगह एक वेबसाइट आप एक regex और कुछ पाठ में टाइप करें और उसके मैचों थूक से बाहर दूँगा कि ...

+0

+1, चूंकि यह सही टूल –

+0

कोई स्पष्ट आवश्यकता नहीं है कि अभिभावक-संलग्न उपयोगकर्ता नाम रिक्त स्थान के बिना किसी नाम का पालन करना चाहिए। "\ (। * \)" पर्याप्त होना चाहिए। – James

+0

सही उपकरण लेकिन गलत आरई - आपको एक ऐसे व्यक्ति की आवश्यकता है जो बिना किसी उपयोगकर्ता के केस को संभाल सके। ऐसा करें और मैं आपको वोट दूंगा :-) – paxdiablo

5

तरह ... ^^

return user.Substring(user.IndexOf('(') + 1).TrimEnd(')'); 

user कोई आरंभिक कोष्ठक शामिल है, तो IndexOf()-1 देता है, हम एक जोड़ते हैं, शून्य प्राप्त करते हैं, और SubString() संपूर्ण स्ट्रिंग देता है। TrimEnd() का कोई प्रभाव नहीं पड़ेगा जब तक कि उपयोगकर्ता का नाम बंद समापन के साथ समाप्त न हो जाए।

user एक आरंभिक कोष्ठक, IndexOf() अपने सूचकांक रिटर्न शामिल है, तो हम एक जोड़कर आरंभिक कोष्ठक skipp, और Substring() के साथ स्ट्रिंग के बाकी निकालें। अंत में हम TrimEnd() के साथ समापन कोष्ठक को हटा दें।

+0

स्ट्रिंग एपीआई का अच्छा उपयोग। –

+0

हालांकि यह इरादे को बहुत अच्छी तरह से प्रतिबिंबित नहीं करता है। –

+0

पहली पंक्ति: एक हैक की तरह ... ^^;) –

1

मैं

int start=user.IndexOf('('); 
if (start != -1) { 
    end = user.IndexOf(')', start); 
    return user.Substring(start+1,end-start-1); 
} else 
    return user; 

प्रयोग करेंगे लेकिन यह सिर्फ एक कॉस्मेटिक बदलाव है: indexOf में अक्षरों का उपयोग एक छोटा सा तेजी से होता है, और सबस्ट्रिंग पद्धति का उपयोग करके अधिक वास्तव में क्या किया जाना चाहिए व्यक्त करने के लिए लगता है (और विधि और अधिक मजबूत अगर आप कोष्ठकों के कई जोड़े है ...)

जिसके अनुसार, डैनियल एल की विधि (String.Split का प्रयोग करके) सरल हो सकता है (लेकिन विकृत तार के साथ बहुत अच्छी तरह से निपटने के नहीं है और करने के लिए है एक स्ट्रिंग सरणी का निर्माण)।

सब कुछ, मैं आपको नियमित अभिव्यक्तियों के प्रति अपने विचलन को दूर करने का सुझाव देता हूं, क्योंकि वह स्थिति बिल्कुल वही है जो उनका उद्देश्य है :-) ...

+0

@ मार्टिन - ठीक है, यह एक (अन) स्वस्थ विचलन है (-_ ^) सबस्ट्रिंग के बारे में आपकी टिप्पणी अधिक अभिव्यक्तिपूर्ण है निश्चित रूप से सच है। –

5

यदि उपयोगकर्ता स्ट्रिंग हमेशा "जो स्मिथ (जेस्मिथ)" रूप में है, तो यह काम करना चाहिए।

private static string DecipherUserName(string user) 
{ 
    string[] names = user.Split(new char[] {'(', ')'}); 
    return names.Length > 2 ? names[1] : user; 
} 

और यदि उपयोगकर्ता स्ट्रिंग हमेशा "जो स्मिथ (जेस्मिथ)" है, तो यह हमेशा काम करेगा।

private static string DecipherUserName(string user) 
{ 
    return "jsmith"; 
} 

केवल हास्य उद्देश्यों के लिए दूसरी प्रविष्टि।

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