2017-11-30 3 views
0

아래 코드를 사용하여 uevent를 구문 분석하려고하지만 정규식이 올바르지 않아 regcomp 함수가 실패하게됩니다.posix uevent 구문 분석을위한 정규 표현식

아무도 도와 줄 수 있습니까? this과 같은 작업을하려고합니다.

#include <stdio.h> 
#include <string.h> 
#include <regex.h> 

int main() 
{ 
    char * source = "[email protected]/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery"; 
    char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)"; 
    size_t maxGroups = 4; 

    regex_t regexCompiled; 
    regmatch_t groupArray[maxGroups]; 

    if (regcomp(&regexCompiled, regexString, REG_EXTENDED)) 
    { 
     printf("Could not compile regular expression.\n"); 
     return 1; 
    }; 
    regfree(&regexCompiled); 

    return 0; 
} 

"정규 표현식을 컴파일 할 수 없습니다."라는 메시지가 나타납니다. 그것은 regcomp가 정규식을 인식하지 못했음을 의미합니다. 내가 코드를 사용하여 오류를보고 할 때

답변

1

는 :

#include <stdio.h> 
#include <string.h> 
#include <regex.h> 

int main(void) 
{ 
    //char * source = "[email protected]/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery"; 
    char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)"; 
    //size_t maxGroups = 4; 

    regex_t regexCompiled; 
    //regmatch_t groupArray[maxGroups]; 

    int rc; 
    if ((rc = regcomp(&regexCompiled, regexString, REG_EXTENDED)) != 0) 
    { 
     char buffer[1024]; 
     regerror(rc, &regexCompiled, buffer, sizeof(buffer)); 
     printf("Could not compile regular expression (%d: %s).\n", rc, buffer); 
     return 1; 
    } 
    regfree(&regexCompiled); 

    return 0; 
} 

을 나는 출력을 얻을 :

Could not compile regular expression (13: repetition-operator operand invalid). 

사용중인 (? 문제는 표기법에 있습니다

"(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)" 

표기법은 PCRE이고 POSIX는 표기하지 않습니다. 그리고 PCRE는 ( 다음에 ?을 사용합니다. POSIX와 같은 다른 정규식 시스템에서는 유효하지 않기 때문입니다.

PCRE 정규 표현식을 사용하려면 PCRE 라이브러리를 설치하고 사용하십시오. 당신이 (5) 총 (일치 플러스 4 개 캡처 그룹 것 문자열의 전체에 대한 regmatch_t이 필요하다는 것을 그와

"([a-zA-Z]+)@\\/(.*)\\/([a-zA-z]+)\\/([a-zA-z]+)" 

을 대신하고, 지적 :

그렇지 않으면, 당신은 사용해야합니다

#include <stdio.h> 
#include <string.h> 
#include <regex.h> 

int main(void) 
{ 
    char *source = "[email protected]/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery"; 
    // char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)"; 
    size_t maxGroups = 5; 
    char *regexString = "([a-zA-Z]+)@\\/(.*)\\/([a-zA-z]+)\\/([a-zA-z]+)"; 

    regex_t regexCompiled; 
    regmatch_t groupArray[maxGroups]; 

    int rc; 
    if ((rc = regcomp(&regexCompiled, regexString, REG_EXTENDED)) != 0) 
    { 
     char buffer[1024]; 
     regerror(rc, &regexCompiled, buffer, sizeof(buffer)); 
     printf("Could not compile regular expression (%d: %s).\n", rc, buffer); 
     return 1; 
    } 
    if ((rc = regexec(&regexCompiled, source, maxGroups, groupArray, 0)) != 0) 
    { 
     char buffer[1024]; 
     regerror(rc, &regexCompiled, buffer, sizeof(buffer)); 
     printf("Could not execute regular expression (%d: %s).\n", rc, buffer); 
     return 1; 
    } 

    printf("Match successful:\n"); 
    for (size_t i = 0; i < maxGroups; i++) 
    { 
     int so = groupArray[i].rm_so; 
     int eo = groupArray[i].rm_eo; 
     printf("%zu: %d..%d [%.*s]\n", i, so, eo, eo - so, &source[so]); 
    } 

    regfree(&regexCompiled); 

    return 0; 
} 

을 출력은 다음과 같습니다 :) 캡처, 당신은 쓸 수

Match successful: 
0: 0..64 [[email protected]/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery] 
1: 0..6 [change] 
2: 8..43 [devices/soc/799999.i2c/i2c-3/3-0015] 
3: 44..56 [power_supply] 
4: 57..64 [battery]