2017-10-14 11 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を渡そうとしましたし、それもうまくいきませんでした。廃止された基本的な、そしてREG_EXTENED:POSIXでサポートされている

答えて

3

正規表現は

残念ながらPOSIX 2つの標準のフレーバーが標準正規表現を(Linuxのregex(7)マニュアルページに文書化のMacOS X用re_format(7)されています)どちらも\bも、(?...)の形式もサポートしていません。どちらもPerlで始まったと思います。

のMac OS X(およびおそらく他のBSD由来のシステム)は、さらに、ポータブルでないREG_ENHANCEDフォーマットを有します。

PCREのような他の正規表現ライブラリを使用することをお勧めします。 POSIXは非キャプチャグループ化をサポートしていないので、単語境界自体は通常の言語ですが、キャプチャグループを使用すると難しくなります。そうでなければ(^|[^[:alpha:])(.*)($|[^[:alpha:]]*)のようなものを使うことができますが、確かに面倒です。

関連する問題