2011-12-20 14 views
5

चलो कहते हैं कि मैं एक स्ट्रिंग करते हैं:Powershell Regex - वैकल्पिक नाम वाले समूह से मेल खाता है

$string1 = "Hello_World:How, are, you:-all -is -well" 

मैं स्ट्रिंग पेट के से अलग नामित समूहों में से अनुभाग से मिलान करने के लिए एक regex का उपयोग करना चाहते हैं। उदाहरण के लिए:

$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)" 

यह $ पैटर्न $ string1 सफलतापूर्वक मेल खाएगा और मैं निम्नलिखित मैचों के साथ खत्म हो जाएगा:

first=Hello_World 
second=How, are, you 
third=-all -is -well 

यह अच्छा है, लेकिन वहाँ एक समस्या है। $ String1 संभावित तीसरे खंड गायब किया जा सकता है, उदाहरण के लिए:

$string1 = "Hello_World:How, are, you" 

दुर्भाग्य से, यह $ string1 नहीं रह गया है regex नमूने का मिलान। मैं इसे कैसे बना सकता हूं ताकि पैटर्न स्ट्रिंग के दोनों प्रारूपों से मेल खा सके? (यानी मुझे हमेशा "पहला" और "दूसरा" मैच होना चाहिए, और केवल एक "तीसरा" मैच प्रदान किया जाना चाहिए)।

उत्तर

5

? क्वांटिफ़ायर और गैर कैप्चरिंग समूह का उपयोग करें। इसके अलावा, .* का उपयोग न करें!

(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))? 

इसके अलावा, आपको कम से कम शुरुआत में अपने रेगेक्स को एंकर करना चाहिए।

2

@ fge का जवाब काम करना चाहिए, लेकिन अगर यह सब आप कर रहे हैं, मैं सुझाव है कि आप String.Split का उपयोग आपको क्या चाहिए पाने के लिए:

$split = $string1.split(':') 
if(($split.count -eq 2) -or ($split.count -eq 3)){ 
    #use $split[0] etc. 
} 
+0

हाँ, है कि और अधिक सरल है। हालांकि, मैं इसे तब तक +1 देने में संकोच करता हूं जब तक ओपी पुष्टि करता है कि अलग-अलग हिस्सों में _do not_ में ':' नहीं है - यह नहीं कि मेरा समाधान सही तरीके से इसे संभालता है, हे। – fge

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