2011-05-26 13 views
5

हैकिंग और पढ़ने के लायक दिनों के बाद, मुझे बूस्ट के रेगेक्स इंजन के साथ कोई भाग्य नहीं मिला है, उम्मीद है कि यहां कोई मदद कर सकता है।नियमित अभिव्यक्ति कैप्चर समूह को बढ़ावा दें

मैं प्रत्येक पंक्ति से पहले फ़ील्ड को पकड़ना चाहता हूं जहां अंतिम फ़ील्ड कुछ इनपुट से मेल खाता है।

string input = 
    "449 a dingo ate my baby THING\n" 
    "448 a dingo ate my baby THING\n" 
    "445 a dingo ate my baby BOOGNISH\n" 
    "446 a dingo ate my baby BOOGNISH\n" 
    "447 a dingo ate my baby STUFF\n"; 

चलो कहते हैं कि मैं अपने regex देता हूँ निम्न स्ट्रिंग ...

string re = "^([0-9]+).+?boognish$"; 
boost::regex expression(re,boost::regex::perl | boost:regex::icase); 

और फिर मेरी मैच

const int subs[] = { 0, 1 }; 
boost::sregex_token_iterator it(input.begin(), input.end(), expression, subs); 
boost::sregex_token_iterator end; 

while (it != end) 

{ 
    fprintf(stderr,"%s|\n", it->str().c_str()); 
    *it++; 
} 

यहाँ की स्थापना की उत्पादन मैं बढ़ावा से हो रही है है , ध्यान रखें मैंने पूरी लाइन और समूह 1 मैच दोनों के लिए पूछा, मैंने एक "|" इसलिए हम आसानी से लाइन के अंत को देख सकते हैं:

449  a dingo ate my baby   THING 
448  a dingo ate my baby  THING 
445  a dingo ate my baby   BOOGNISH| 
449| 
446  a dingo ate my baby   BOOGNISH| 
446| 

मुझे वास्तव में 445 चाहिए। और 446 | केवल, लेकिन यह मुझे 44 9 दे रहा है (जब तक यह पहली बुगनिष हिट नहीं करता) और फिर 446. मैंने इसका परीक्षण अन्य रीर्सर्स पर किया है, और ऐसा लगता है कि यह ठीक काम करता है। मैं बढ़ावा देने के साथ क्या गलत कर रहा हूँ?

अग्रिम धन्यवाद!

+1

'* यह ++' '++ होना चाहिए। लेकिन वह (शायद) आपके परिणामों को प्रभावित नहीं करता है। –

उत्तर

1

this articale के अनुसार आपको मिलान करने वाले एल्गोरिदम में flag match_not_dot_newline पास करना होगा। मुझे लगता है कि आपके मामले को हल करेगा।

+0

perl का उपयोग करें :: regex :: no_mod_s perl के लिए! यह मुझे थोड़ा झुकाव ले गया, लेकिन मुझे अंत में यह काम करने के लिए मिला। आप बस एक * टैड * बंद थे, लेकिन वास्तव में करीब। क्योंकि मैं पर्ल रेगेक्स इंजन का उपयोग कर रहा था, यह चाहता था कि मैं झंडे के पर्ल विकल्प/संस्करण का उपयोग करूं। (मैंने सिर्फ match_not_dot_newline का उपयोग करने का प्रयास किया, लेकिन यह अभी भी व्यवहार कर रहा था जैसा कि पहले था)। उस ध्वज को सेट करने के लिए पर्ल इंजन को मजबूर करने के लिए, ऐसा लगता है कि आपको boost :: regex :: no_mod_s ध्वज का उपयोग करने की आवश्यकता है। आपकी मदद के लिए धन्यवाद। – yggdrasil

+0

यह becouse है कि यह बढ़ावा देने के लिए मेरा पहला मुठभेड़ था और दृश्य स्टूडियो खोज बॉक्स के अलावा कहीं भी regex का उपयोग करने की मेरी पहली कोशिश! – Ali1S232

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