2011-09-28 14 views
8

मैं रेगेक्स के साथ स्ट्रिंग को पार्स करने के लिए एक्सेस वीबीए का उपयोग कर रहा हूं।वीबीए पॉजिटिव लुकहेड बहुत लालची है

regexSearch("^.+(?=[ _-]+mp)", "153 - MP 13.61 to MP 17.65") 

मैं पाने के लिए उम्मीद कर रहा हूँ:

Function regexSearch(pattern As String, source As String) As String 

Dim re As RegExp 
Dim matches As MatchCollection 
Dim match As match 


Set re = New RegExp 
re.IgnoreCase = True 

re.pattern = pattern 
Set matches = re.Execute(source) 


    If matches.Count > 0 Then 
     regexSearch = matches(0).Value 
    Else 
     regexSearch = "" 
    End If 


End Function 

जब मैं इसके साथ परीक्षण: यहाँ मेरी regex समारोह है

153 

क्योंकि यह और का पहला उदाहरण के बीच केवल अक्षर 'एमपी' लुकहेड में निर्दिष्ट कक्षा में हैं।

लेकिन मेरी वास्तविक वापसी मान है:

153 - MP 13.61 to 

क्यों यह दूसरा 'सांसद' अप करने के लिए कैप्चर कर रहा है?

उत्तर

12

क्योंकि .+ डिफ़ॉल्ट रूप से लालची है। .+ प्रत्येक चरित्र को तब तक घुमाता है जब तक कि यह लाइन ब्रेक चार या अंत-इनपुट में न हो। जब ऐसा होता है, तो यह पिछले MP (आपके मामले में दूसरा) पर बैकट्रैक करता है।

आप क्या चाहते हैं ungreedy से मेल खाना है। यह रखकर किया जा सकता है एक ?.+ के बाद:

regexSearch("^.+?(?=[ _-]+MP)", "153 - MP 13.61 to MP 17.65") 
+0

कि इसे हल। – sigil

+0

उस सिगिल को सुनकर अच्छा लगा। –

+0

+1 अच्छी तरह से किया गया। – brettdj

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