2017-10-14 1 views
0

내 C 코드에서 정규 표현식을 사용하여 읽고있는 텍스트 파일의 각 행에서 문자열을 찾고, \b 경계가 그 것처럼 보입니다. 작동하지. 그 문자열은 더 큰 문자열의 일부가 될 수 없습니다. 나는 또한 다음과 그것뿐만 아니라 내 코드에서 작동 만들 수 없습니다 (소스 here)에서 일부 손으로 쓴 경계 발현 시도가 실패 후표현식에서 b를 사용할 때 C에서 regexec이 일치하지 않습니다.

:

(?i)(?<=^|[^a-z])MYWORDHERE(?=$|[^a-z]) 

을하지만, 내가 좋아하는 a을 간단하게 뭔가를하려고 할 때 정규식으로 예상되는 것을 찾습니다.

가 여기 내 단축 코드 조각입니다 다음 regcomp 기능에

#include <regex.h> 
void readFromFile(char arr[], char * wordToSearch) { 
    regex_t regex; 
    int regexi; 

    char regexStr [100]; 
    strcpy(regexStr, "\\b("); 
    strcat(regexStr, wordToSearch); 
    strcat(regexStr, ")\\b"); 

    regexi = regcomp(&regex, regexStr, 0); 
    printf("regexi while compiling: %d\n", regexi); 
    if (regexi) { 
    fprintf(stderr, "compile error\n"); 
    } 

    FILE* file = fopen(arr, "r"); 
    char line[256]; 

    while (fgets(line, sizeof(line), file)) { 
    regexi = regexec(&regex, line, 0, NULL, 0); 
    printf("%s\n", line); 
    printf("regexi while execing: %d\n", regexi); 
    if (!regexi) { 
     printf("there is a match."); 
    } 
    } 
    fclose(file); 
} 

, 나는 또한 플래그와 REG_EXTENDED을 통과 시도하고 또한 작동하지 않았다. POSIX 지원

답변

3

정규 표현식은 리눅스 regex(7) 매뉴얼 페이지에 설명하고 re_format(7) 맥 OS X의

2 개 표준 맛에 와서 불행하게도 POSIX 표준 정규 표현식 (대한됩니다 오래된 기본 및 REG_EXTENED)는 \b이나 (?...) 형식을 지원하지 않습니다. 둘 다 Perl에서 비롯된 것 같습니다.

맥 OS X (및 가능한 다른 BSD 유도 시스템)을 별도로 이식하지 않은 REG_ENHANCED 형식을 갖는다.

최상의 선택은 PCRE과 같은 다른 정규식 라이브러리를 사용하는 것입니다. 단어 경계 자체는 일반적인 언어이지만 포착 그룹을 사용하면 POSIX가 비 포획 그룹을 지원하지 않기 때문에 더 어렵게 만듭니다. 그렇지 않으면 (^|[^[:alpha:])(.*)($|[^[:alpha:]]*)과 같은 것을 사용할 수는 있지만 확실히 엉망이 될 것입니다.

관련 문제