2015-07-28 23 views
5

मेरे पास tabLength नामक एक फ़ंक्शन है जो एक स्ट्रिंग लौटा देना चाहिए। यह एक पाठ दस्तावेज़ में स्वरूपण के लिए है।स्विच/केस स्टेटमेंट

कोई भी मेरे स्विच स्टेटमेंट को देख सकता है और देख सकता है कि मुझे लाइन 6 पर कोई त्रुटि क्यों मिल रही है। यह 'मामला' है कि स्विच स्टेटमेंट चल रहा है।

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch -regex ($lineLength) { 
     "[1-4]" { return "`t`t`t" } 
     "[5-15]" { return "`t`t" } 
     "[16-24]" { return "`t" } 
     default { return "`t" } 
    } 
} 

त्रुटि संदेश:

Invalid regular expression pattern: [5-15]. 
At C:\Users\name\desktop\nslookup.ps1:52 char:11 
+   "[5-15]" <<<< { return "" } 
    + CategoryInfo   : InvalidOperation: ([5-15]:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvalidRegularExpression 

यह केवल हो रहा है मूल्यों के [5-15] के माध्यम से भेजा जा रहा है।

+0

आप सटीक त्रुटि संदेश पोस्ट कर सकता है? यहां पूरी तरह से ठीक काम करता है (विन 7 पर पीएस 4.0)। –

+0

हाँ – Dominic

उत्तर

6

[5-15] मान्य रेगेक्स चरित्र वर्ग नहीं है। आप तारों से मेल खाते हैं, संख्याओं की संख्या नहीं, इसलिए [5-15] अनिवार्य रूप से कहता है "'5' से '1', या '5' 'से एक वर्ण से मिलान करें जो आप नहीं चाहते हैं।

यदि आप उस मध्यम स्थिति को हटाते हैं, तो [16-24] इसी तरह विफल होना चाहिए।

लिए इस प्रकार एक switch बयान है कि regex का उपयोग नहीं करता है की कोशिश करो, लेकिन स्थितियों के लिए एक स्क्रिप्ट ब्लॉक का उपयोग करता है ताकि आप परीक्षण करने के लिए एक सीमा का उपयोग कर सकते हैं:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch ($lineLength) { 
     { 1..4 -contains $_ } { return "`t`t`t" } 
     { 5..15 -contains $_ } { return "`t`t" } 
     { 16..24 -contains $_ } { return "`t" } 
     default { return "`t" } 
    } 
} 

PowerShell में 3 +, आप कर सकते थे -in ऑपरेटर का उपयोग करें और क्रम को उल्टा:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch ($lineLength) { 
     { $_ -in 1..4 } { return "`t`t`t" } 
     { $_ -in 5..15 } { return "`t`t" } 
     { $_ -in 16..24 } { return "`t" } 
     default { return "`t" } 
    } 
} 
+0

नाइस के बारे में खेद है। एक और मामला जहां रेगेक्स बस इसके लायक नहीं है। मैं खुद को –

+0

@ माथीसआर.जेसेन अच्छी तरह से दिखाऊंगा, यह सब के बाद होमवर्क है, कभी-कभी दी गई समस्याओं की सीमाएं समझ में नहीं आती हैं, इसलिए हो सकता है कि उन्हें * इसके लिए रेगेक्स का उपयोग करना चाहिए, इसलिए रेगेक्स मार्ग दिखाने के लिए +1 । – briantist

2

रेगुलर एक्सप्रेशन से मेल चरित्र-दर-चरित्र, पूर्णांकों नहीं। श्रेणी [5-15] बस रेगेक्स इंजन के लिए समझ में नहीं आता है।

कोशिश जोड़ने एंकर:

Function tabLength ($line) { 
    $lineLength = $line.Length 

    switch -regex ($lineLength) { 
     "^[1-4]$" { return "`t`t`t" } 
     "^[5-9]$|^1[0-5]$" { return "`t`t" } 
     "^1[6-9]$|^2[0-4]$" { return "`t" } 
     default { return "`t" } 
    } 
} 
4

@briantist अपने तत्काल सवाल का जवाब देने के लिए मुझे हराया। हालांकि, चूंकि आप कहते हैं कि आपका लक्ष्य टेक्स्ट प्रारूपित करना है, इसलिए आप एक पूरी तरह से अलग दृष्टिकोण पर विचार करना चाहेंगे।

पावरशेल में format operator (-f) है जो आपको विभिन्न तरीकों से तारों (साथ ही संख्याओं या तिथियों) को प्रारूपित करने की अनुमति देता है।

Function alignRight ($line) { 
    '{0,30}' -f $line 
} 

तुम भी एक स्तंभ पर गद्देदार है के लिए इसका उपयोग कर सकते हैं: उदाहरण के लिए आप पाठ एक 30 चरित्र विस्तृत स्तंभ के दाईं ओर गठबंधन (यानी बाएं गद्देदार पाठ), तो आप कुछ इस तरह कर सकता है चाहता हूँ सही।

प्रदर्शन:

PS C:\>'-{0,5}-' -f 'abc' 
- abc- 
PS C:\>'-{0,-5}-' -f 'abc' 
-abc -
+0

ग्रेट जॉब क्या हो रहा है (संभवतः) वास्तविक रूट समस्या है! – briantist

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