2013-05-07 6 views
10

अब जब मैं जैसे, str में सभी मैच पदों लौटना चाहते:पॉज़िक्स सी में regexec() क्यों पहले मैच को वापस लौटाता है, यह केवल एक बार दौड़ने के लिए सभी मैच पदों को कैसे वापस कर सकता है?

abcd123abcd123abcd 

मान लीजिए मैं सभी "एबीसीडी" प्राप्त करना चाहते हैं, मैं, regexec() का उपयोग करना चाहिए पहले की स्थिति प्राप्त: 0, 3, तो मैं का उपयोग करेगा:

123abcd123abcd 

नया स्ट्रिंग के रूप में regexec) फिर से उपयोग करने के लिए (, और इतने पर। मैं के बारे में मैनुअल पढ़ने regexec(), यह कहते हैं:

int regexec(const regex_t *preg, const char *string, size_t nmatch, 
       regmatch_t pmatch[], int eflags); 
nmatch and pmatch are used to provide information regarding the location of any 
matches. 

लेकिन क्यों यह काम नहीं करता है? यह मेरा कोड है:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <regex.h> 

int main(int argc, char **argv) 
{ 
    int i = 0; 
    int res; 
    int len; 
    char result[BUFSIZ]; 
    char err_buf[BUFSIZ]; 
    char* src = argv[1]; 

    const char* pattern = "\\<[^,;]+\\>"; 
    regex_t preg; 

    regmatch_t pmatch[10]; 

    if((res = regcomp(&preg, pattern, REG_EXTENDED)) != 0) 
    { 
     regerror(res, &preg, err_buf, BUFSIZ); 
     printf("regcomp: %s\n", err_buf); 
     exit(res); 
    } 

    res = regexec(&preg, src, 10, pmatch, REG_NOTBOL); 
    //~ res = regexec(&preg, src, 10, pmatch, 0); 
    //~ res = regexec(&preg, src, 10, pmatch, REG_NOTEOL); 
    if(res == REG_NOMATCH) 
    { 
     printf("NO match\n"); 
     exit(0); 
    } 
    for (i = 0; pmatch[i].rm_so != -1; i++) 
    { 
     len = pmatch[i].rm_eo - pmatch[i].rm_so; 
     memcpy(result, src + pmatch[i].rm_so, len); 
     result[len] = 0; 
     printf("num %d: '%s'\n", i, result); 
    } 
    regfree(&preg); 
    return 0; 
} 

./regex 'hello, world' 

उत्पादन: मेरे सम्मान आउटपुट

num 0: 'hello' 

यह है:

num 0: 'hello' 
num 1: 'world' 
+0

हमें दिखाती है कि आप कैसे regexec कहते हैं। –

उत्तर

9

regexec एक regex मिलान किया जाता है। एक बार एक मैच मिल गया है regexec शून्य लौटाएगा (यानी सफल मैच)। पैरामीटर pmatch में उस एक मैच के बारे में जानकारी होगी। पहली सरणी अनुक्रमणिका (यानी शून्य) में पूरा मिलान होगा, बाद के सरणी सूचकांक में कैप्चर समूह/उप-अभिव्यक्तियों के बारे में जानकारी होती है।

प्रदर्शित करने के लिए:

const char* pattern = "(\\w+) (\\w+)"; 

पर "हैलो दुनिया" का मिलान उत्पादन होगा:

num 0: 'hello world' - entire match 
num 1: 'hello'  - capture group 1 
num 2: 'world'  - capture group 2 

(यह action में देखें)

सबसे regex में व्यवहार आप की तलाश हो सकता था परिवेशों वैश्विक संशोधक का उपयोग करके प्राप्त किया गया है:/जी। Regexec इस संशोधक को ध्वज के रूप में प्रदान नहीं करता है और न ही यह संशोधक का समर्थन करता है। इसलिए आपको लूप करना होगा जबकि रेगेक्सैक पिछले मैच के अंतिम चरित्र से शुरू होने वाले शून्य को वापस लौटाएगा ताकि सभी मैच प्राप्त हो सकें।

वैश्विक संशोधक पीसीआरई लाइब्रेरी (मशहूर रेगेक्स सी लाइब्रेरी) का उपयोग करके भी उपलब्ध नहीं है। PCRE आदमी पृष्ठों इस इसके बारे में क्या कहना है: pcre_exec बुला द्वारा

() उचित तर्क के साथ कई बार, आप की नकल कर सकते हैं पर्ल के/जी विकल्प

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