2013-01-23 24 views
5

मैं स्ट्रिंग निम्नलिखित है में दो विभाजक के बीच-स्ट्रिंग हो रही है:एक मनमाना स्थिति

string source = "Test/Company/Business/Department/Logs.tvs/v1"; 

/ चरित्र स्ट्रिंग में विभिन्न तत्वों के बीच विभाजक है। मुझे स्ट्रिंग के अंतिम दो तत्व प्राप्त करने की आवश्यकता है। मेरे पास इस उद्देश्य के लिए निम्नलिखित कोड है। यह ठीक काम करता है। क्या इसके लिए कोई तेज/सरल कोड है?

कोड

static void Main() 
    { 
     string component = String.Empty; 
     string version = String.Empty; 
     string source = "Test/Company/Business/Department/Logs.tvs/v1"; 
     if (!String.IsNullOrEmpty(source)) 
     { 
      String[] partsOfSource = source.Split('/'); 
      if (partsOfSource != null) 
      { 
       if (partsOfSource.Length > 2) 
       { 
        component = partsOfSource[partsOfSource.Length - 2]; 
       } 

       if (partsOfSource.Length > 1) 
       { 
        version = partsOfSource[partsOfSource.Length - 1]; 
       } 
      } 
     } 

     Console.WriteLine(component); 
     Console.WriteLine(version); 
     Console.Read(); 
    } 

उत्तर

4

क्यों कोई नियमित अभिव्यक्ति नहीं है? यह एक काफी आसान है:

.*/(?<component>.*)/(?<version>.*)$ 

तुम भी अपने समूहों लेबल कर सकते हैं तो अपने मैच के लिए तुम सब करने की जरूरत है:

component = myMatch.Groups["component"]; 
version = myMatch.Groups["version"]; 
+1

यह एक शर्म की बात है आप कर सकते हैं ' इस तरह के मामलों में रेगेक्स इंजन मैच "से-द-दाएं" बनाते हैं। – Rawling

+1

@ राउलिंग: सहमत। मुझे लगता है कि आप पहले स्ट्रिंग को उलट सकते हैं, लेकिन शायद यह भी कम कुशल है। असल में, मुझे आश्चर्य है कि क्या किसी रेगएक्स इंजन के लिए उस तरह के अनुकूलन को शामिल करना संभव नहीं है जब अभिव्यक्ति में '$' है लेकिन कोई '^' नहीं है। –

+2

... ठीक है, आज मैंने सीखा है कि आप 'Regex.Match (स्रोत, "/(.*?)/(.*?)$", RegexOptions.RightToLeft) जैसे कुछ भी कर सकते हैं, या यहां तक ​​कि '$' इस मामले में। – Rawling

2

आपका कोड ज्यादातर ठीक लग रहा है। कुछ बिंदुओं को नोट करने के लिए:

  1. String.Split() कभी वापस शून्य नहीं होगा, इसलिए आपको उस पर शून्य जांच की आवश्यकता नहीं है।
  2. यदि source स्ट्रिंग में दो से कम / वर्ण हैं, तो आप इससे कैसे निपटेंगे? (मूल पोस्ट को इस पते के लिए अपडेट किया गया था)
  3. क्या आप वास्तव में खाली स्ट्रिंग आउटपुट करना चाहते हैं यदि आपकी स्रोत स्ट्रिंग शून्य या खाली (या अमान्य) है? यदि आपके पास इनपुट की प्रकृति के बारे में विशिष्ट अपेक्षाएं हैं, तो आप उन उम्मीदों को पूरा नहीं कर सकते हैं जब आप उम्मीदों को पूरा नहीं कर सकते हैं।
2

आपका दृष्टिकोण यह देखते हुए कि आपके लिए देख रहे हैं सबसे उपयुक्त एक है एक विशेष सूचकांक पर substrings। इस मामले में ऐसा करने के लिए एक LINQ अभिव्यक्ति संभवतः कोड या इसकी पठनीयता में सुधार नहीं करेगी।

संदर्भ के लिए, स्ट्रिंग्स और LINQ के साथ काम करने पर Microsoft here से कुछ अच्छी जानकारी है। विशेष रूप से आलेख here देखें जो LINQ और RegEx दोनों के साथ कुछ उदाहरणों को शामिल करता है।

संपादित करें: +1 रेगएक्स दृष्टिकोण के भीतर मैट के नामित समूह के लिए ... यह मैंने देखा सबसे अच्छा समाधान है।

3

निम्नलिखित , तेजी से किया जाना चाहिए, क्योंकि यह केवल स्ट्रिंग के रूप में ज्यादा स्कैन करता है के रूप में यह दो / को खोजने के लिए की जरूरत है और यह पूरी स्ट्रिंग ऊपर बंटवारे परेशान नहीं करता है:

string component = ""; 
string version = ""; 
string source = "Test/Company/Business/Department/Logs.tvs/v1"; 
int last = source.LastIndexOf('/'); 
if (last != -1) 
{ 
    int penultimate = source.LastIndexOf('/', last - 1); 
    version = source.Substring(last + 1); 
    component = source.Substring(penultimate + 1, last - penultimate - 1); 
} 

कहा , जैसा कि सभी प्रदर्शन प्रश्नों के साथ: प्रोफ़ाइल! वास्तविक जीवन इनपुट की एक बड़ी सूची के साथ दोनों तरफ से प्रयास करें और देखें कि सबसे तेज़ कौन सा है।

(इसके अलावा, इस, रिक्त स्ट्रिंग छोड़ देंगे बजाय अगर वहाँ इनपुट में कोई स्लेश एक अपवाद फेंक ... लेकिन फेंक अगर source रिक्त है आलसी मुझे।)

+0

यह समयपूर्व अनुकूलन की तरह लगता है। यह बेहद असंभव है कि इस स्ट्रिंग को विभाजित करना एक प्रदर्शन बाधा बनने जा रहा है। – StriplingWarrior

+0

फिर भी, जब ओपी ने तेज़/सरल कोड के लिए कहा है ... – Rawling

1

आप की तरह कुछ की कोशिश कर सकते यह मुझे संदेह है कि यह बहुत तेज़ होगा। आप System.Diagnostics.StopWatch के साथ कुछ आश्वासन कर सकते हैं यह देखने के लिए कि क्या आपको आवश्यकता महसूस होती है या नहीं।

string source = "Test/Company/Business/Department/Logs.tvs/v1"; 

int index1 = source.LastIndexOf('/'); 
string last = source.Substring(index1 + 1); 

string substring = source.Substring(0, index1); 
int index2 = substring.LastIndexOf('/'); 
string secondLast = substring.Substring(index2 + 1); 
1

मैं कोशिश करेगा

 string source = "Test/Company/Business/Department/Logs.tvs/v1"; 

     var components = source.Split('/').Reverse().Take(2); 

     String last = string.Empty; 

     var enumerable = components as string[] ?? components.ToArray(); 
     if (enumerable.Count() == 2) 
      last = enumerable.FirstOrDefault(); 
     var secondLast = enumerable.LastOrDefault(); 

आशा इस में मदद मिलेगी

+0

दिलचस्प ... धन्यवाद – Lijo

+1

@ लिजो ने आर # से कुछ रिफैक्टरिंग के साथ अपना जवाब संपादित किया और घटकों के लिए समर्थन जोड़ा। गणना <2 (उम्मीद है कि इससे मदद मिलेगी) – jbl

-1

आप नीचे के रूप में प्रक्रिया का उपयोग कर पिछले दो शब्द को पुनः प्राप्त कर सकते हैं:

string source = "Test/Company/Business/Department/Logs.tvs/v1"; 

String[] partsOfSource = source.Split('/'); 
if(partsOfSourch.length>2) 
for(int i=partsOfSourch.length-2;i<=partsOfSource.length-1;i++) 
console.writeline(partsOfSource[i]);