2012-08-14 15 views
11

का उपयोग करके "शुरुआत-रेखा" मिलान करना मैं किसी दिए गए शब्द से शुरू होने वाली सभी पंक्तियों से मेल खाना चाहता हूं, iheap कहें। अगर मुझे नियमित अभिव्यक्ति (ईसीएमएस्क्रिप्ट सिंटैक्स में) गलती नहीं है तो "^iheap.*" चाल चलाना चाहिए। हालांकि, जब मैंने libC++ की regex लाइब्रेरी का उपयोग करके C++ 11 में इसका परीक्षण किया, तो केवल पहली पंक्ति मेल खाती है। तो "^..." केवल शुरुआत के बजाय शुरुआत के इनपुट से मेल खाता है।libC++ regex लाइब्रेरी (सी ++ 11)

यहाँ एक उदाहरण है:

#include <string> 
#include <regex> 
#include <iostream> 

using namespace std; 

int main() { 
     regex rx("^iheap.*"); 
     string s = "iheap says hello.\niheap says hello again.\n"; 
     cout << s << regex_replace(s, rx, "IHEAP"); 
     return 0; 
} 

आउटपुट:

iheap says hello. 
iheap says hello again. 
IHEAP 
iheap says hello again. 

इस libc की ++ एक बग या कुछ गलत मैं कर रहा हूँ है? धन्यवाद!

नोट: मै मैक ओएस एक्स माउंटेन शेर और ऐप्पल एलएलवीएम कंपाइलर 4.0 (मूल रूप से क्लैंग 3.1 एसवीएन का एक स्नैपशॉट) का उपयोग कर रहा हूं।

+0

बस इस समस्या पर ठोकर खाई ... fyi, boost :: regex (ईएमसीएस्क्रिप्ट मोड में) शुरुआत से मेल खाता है, यानी आपका रेगेक्स काम करेगा। – fscan

+0

एचआरएमएम, केवल थोड़ा सा संबंधित है, लेकिन '$' VS2013 में '\ r \ n' के खिलाफ मेल नहीं खाता है - यह' \ s * $ 'लेता है या मैच के समान होता है ... – Cameron

उत्तर

5

मैंने सभी प्रासंगिक मानकों को देखा है, और जहां तक ​​मैं कह सकता हूं,^केवल स्ट्रिंग की शुरुआत से मेल खाता है, न कि एक नई लाइन, जब तक कि इंजन मल्टीलाइन मोड में न हो। डिफ़ॉल्ट इंजन ECMA-262 इंजन डिफ़ॉल्ट रूप से मल्टीलाइन मोड में नहीं है, और मुझे std C++ इंटरफ़ेस का उपयोग करके इसे मल्टीलाइन मोड में डालने का कोई तरीका नहीं दिखता है।

यह सब कहा जा रहा है कि अगर कोई मुझे मानक पाठ की ओर इंगित कर सकता है जो अलग-अलग कहता है, तो मैं इसे एक बग रिपोर्ट पर विचार करूंगा और इसे ठीक करने के लिए अपनी पूरी कोशिश करूंगा।

+1

बस एक गड़बड़ी के लिए, इसे आज़माएं: '(? मीटर)^iheap। *'। ईसीएमए -262 इनलाइन संशोधक निर्दिष्ट नहीं करता है, लेकिन 'libC++' वैसे भी उनका समर्थन कर सकता है। यह एकमात्र ईसीएमएस्क्रिप्ट रेगेक्स कार्यान्वयन नहीं होगा जो एकतरफा रूप से सुविधाओं में शामिल सुविधाओं के लिए समर्थन जोड़ने के लिए नहीं होगा। –

+0

@AlanMoore: बस कोशिश की, एक अपवाद फेंक दिया गया है। दुर्भाग्यवश ऐसा लगता है कि वे उस एक्सटेंशन का समर्थन नहीं कर रहे हैं। – iheap

+2

हैलो हॉवर्ड। मुझे एक मानक पाठ भी नहीं मिला जो प्रश्न सुलझता है, लेकिन मुझे लगता है कि मेरे पास यह औचित्य साबित करने के लिए पर्याप्त औचित्य है कि डिफ़ॉल्ट मोड मल्टीलाइन होना चाहिए। 'Std :: regex_constants :: match_not_bol' ध्वज है जिसका कार्य यह सुनिश्चित करने के लिए है कि' "" "दावा इनपुट की शुरुआत से मेल नहीं खाता है। मल्टीलाइन मोड में उस ध्वज के साथ; ''^'' दावा पहली पंक्ति को छोड़कर सभी लाइनों से मेल खाता है। सिंगल-लाइन मोड में, वह ध्वज '"^"'दावा' गैर-कार्यात्मक बना देगा, जो मुझे समझ में नहीं आता है। – iheap