2015-01-14 8 views
5

काटना, पात्रों में से एक दिया अधिकतम संख्या के लिए एक स्ट्रिंग, (SubString() का उपयोग कर?), काटना भी यदि मूल स्ट्रिंग पहले से ही कम है PowerShell में संभव यह है?सबस्ट्रिंग स्ट्रिंग लंबाई

उदाहरण के लिए:

foreach ($str in "hello", "good morning", "hi") { $str.subString(0, 4) } 

काट-छांट hello और good morning के लिए काम कर रहा है, लेकिन मैं hi के लिए कोई त्रुटि मिलती है।

मैं निम्नलिखित परिणाम चाहते हैं:

hell 
good 
hi 
+0

जैसा कि आप अक्षर को जोड़ना चाहते हैं यदि यह छोटा है और यदि यह लंबा है तो उन्हें हटा दें? – arco444

+0

यदि यह छोटा है, तो स्ट्रिंग को वैसे ही रखें, वर्ण जोड़ने की कोई आवश्यकता नहीं है। –

उत्तर

14

आप वर्तमान आइटम का मूल्यांकन करें और यह की लंबाई प्राप्त करने की आवश्यकता। यदि लंबाई 4 से कम है तो सबस्ट्रिंग फ़ंक्शन में इसका उपयोग करें।

foreach ($str in "hello", "good morning", "hi") { 
    $str.subString(0, [System.Math]::Min(4, $str.Length)) 
} 
1

आप जाल अपवाद किए जा सकेंगे:

foreach ($str in "hello", "good morning", "hi") { 
    try { 
    $str.subString(0, 4) 
    } 
    catch [ArgumentOutOfRangeException] { 
    $str 
    } 
} 
0

तुम भी -replace

foreach ($str in "hello", "good morning", "hi") { $str -replace '(.{4}).+','$1' } 

hell 
good 
hi 
+1

आपका आउटपुट उस चीज़ से मेल नहीं खाता है जिसके लिए पूछा गया था। – Duncan

+0

@ अपने अधिकार का पालन करें। स्थिर – mjolinor

5

उपयोग कर सकते हैं या आप बस इसे सरल रखने के सकता है, एक त्रिगुट ऑपरेटर के लिए powershell वैकल्पिक का उपयोग कर:

foreach ($str in "hello", "good morning", "hi") { 
    $(if ($str.length -gt 4) { $str.substring(0, 4) } else { $str }) 
} 

जबकि अन्य सभी उत्तर "सही" हैं, उनकी क्षमता उप-इष्टतम से संभावित रूप से डरावनी है। निम्नलिखित अन्य उत्तरों की आलोचना नहीं है बल्कि उनके अंतर्निहित संचालन की निर्देशक तुलना के रूप में है। आखिरकार, स्क्रिप्टिंग इसे तेजी से चलने से जल्द ही इसे चलाने के बारे में अधिक है।

आदेश में:

1.

foreach ($str in "hello", "good morning", "hi") { 
    $str.subString(0, [System.Math]::Min(4, $str.Length)) 
} 

यह मूलतः बजाय सिवाय इसके कि मेरी भेंट के रूप में ही है सिर्फ $ str जब यह बहुत छोटा है लौटने, हम सबस्ट्रिंग और यह बताने के वापस जाने के लिए कॉल पूरी स्ट्रिंग इसलिए, उप-इष्टतम। यह अभी भी कर रहा है..तो..ठीक है लेकिन बस न्यूनतम के अंदर, vis।

if (4 -lt $str.length) {4} else {$str.length} 

2.

foreach ($str in "hello", "good morning", "hi") { $str -replace '(.{4}).+','$1' } 

नियमित अभिव्यक्ति पहले 4 अक्षर खींचते हैं और फिर उनके साथ पूरी स्ट्रिंग को बदलने के लिए मिलान उपयोग करने का अर्थ है कि पूरे (संभवतः बहुत लंबे) स्ट्रिंग मिलान द्वारा स्कैन किया जाना चाहिए अज्ञात जटिलता/दक्षता का इंजन। जबकि कोई व्यक्ति देख सकता है कि '+' स्ट्रिंग के पूरे शेष से मेल खाता है, तो मिलान इंजन बैकट्रैकिंग विकल्पों की एक बड़ी सूची बना सकता है क्योंकि पैटर्न को एंकर नहीं किया जाता है (शुरुआत में कोई^नहीं)। (वर्णित नहीं) यहां चालाक बिट यह है कि यदि स्ट्रिंग 5 वर्णों से कम है (4 गुना। 1 या उससे अधिक के बाद।) तो पूरा मिलान विफल हो जाता है और रिटर्न $ str unaltered को प्रतिस्थापित करता है।

3।

foreach ($str in "hello", "good morning", "hi") { 
    try { 
    $str.subString(0, 4) 
    } 
    catch [ArgumentOutOfRangeException] { 
    $str 
    } 
} 

कार्यक्रम संबंधी सीमा जाँच के बजाय जानबूझकर फेंक अपवाद एक दिलचस्प समाधान है, लेकिन कौन जानता है कि क्या अपवाद को पकड़ने की कोशिश ब्लॉक से ऊपर बुलबुले के रूप में चल रहा है। शायद इस साधारण मामले में ज्यादा कुछ नहीं, लेकिन यह ऐसी स्थितियों को छोड़कर एक अनुशंसित सामान्य अभ्यास नहीं होगा जहां त्रुटियों के कई संभावित स्रोत हैं (इसे सभी के लिए जांचने में बोझिल बनाना) लेकिन केवल कुछ प्रतिक्रियाएं हैं।

दिलचस्प है, एक ऐसी ही प्रश्न का उत्तर कहीं -join का उपयोग कर और सरणी स्लाइस (जो सूचकांक पर त्रुटियों सीमा से बाहर नहीं पैदा कर करो, बस लापता तत्वों की अनदेखी)

$str[0..3] -join "" # infix 

(या अधिक बस)

-join $str[0..3]  # prefix 

सबसे स्ट्रिंग और चार के भंडारण [] के बीच मजबूत समानता को देखते हुए (उचित अनुकूलन के साथ) कुशल हो सकता है। ऑप्टिमाइज़ेशन की आवश्यकता होगी, डिफ़ॉल्ट रूप से, $ str [0..3] एक ऑब्जेक्ट [] है, प्रत्येक तत्व एक एकल होता है, और इसलिए एक स्ट्रिंग (स्मृति में) के साथ थोड़ा समानता भालू होती है। powershell देते एक छोटे से संकेत उपयोगी हो सकता है,

-join [char[]]$str[0..3] 

हालांकि, हो सकता है सिर्फ यह कह रहा है कि तुम क्या वास्तव में चाहते हैं,

new-object string (,$str[0..3]) # need $str[0..3] to be a member of an array of constructor arguments 

जिससे सीधे

new String(char[]) 

लागू सबसे अच्छा है।

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