2016-08-09 4 views
6

私は正規表現をシェルで使用していますが、C言語のプログラムでは動作しません。RegexはC言語で動作していません

何か考えてください。

echo "abc:[email protected]" | grep -E "(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)" //shell 

reti = regcomp(&regex,"(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)", 0); //c program 
+5

'grepの-E'は(私はいくつかの機能強化と、それはEREに近いと思います)ERE構文を使用していますよう

いくつかのエンジン。 'regcomp'に' REG_EXTENDED'フラグを渡してください。それでも、 '\ b'が' regex.h 'でサポートされているかどうかわかりません。 –

+0

Cバージョンでは、C文字列の中に単一のバックスラッシュを使用しています。これらのバックスラッシュは正規表現ライブラリに渡されないので、うまくいきません。 (どちらですか?) – usr2564301

答えて

3

grep -Eは(もと(){n,m}数量詞の中括弧をエスケープする必要がないことを意味するいくつかの拡張ERE構文(BREの正規表現ではない場合)を使用しています。あなたは、ワード境界を使用する最初の\b(^|[^[:alnum:]_])と「同等」を置き換えることはできませんので、

あなたは、またregcompREG_EXTENDEDフラグを渡して、する必要があります。 (^|[^[:alnum:]_])部分が文字列(^)の開始または(|)英数字またはアンダースコア以外の文字のいずれかと一致する

const char *str_regex = "(^|[^[:alnum:]_])(abc|def):[0-9]{10}@([A-Za-z0-9].*)"; 

:が右後のパターンでありますので、あなたは何の末尾\bを必要としません。

C demo

POSIXはそれ自身のワード境界の構造をサポートして表示されます上記のリンクから
#include <stdio.h> 
#include <stdlib.h> 
#include <regex.h> 

int main (void) 
{ 
    int match; 
    int err; 
    regex_t preg; 
    regmatch_t pmatch[4]; 
    size_t nmatch = 4; 
    const char *str_request = "abc:[email protected]"; 

    const char *str_regex = "(^|[^[:alnum:]_])(abc|def):[0-9]{10}@([A-Za-z0-9].*)"; 
    err = regcomp(&preg, str_regex, REG_EXTENDED); 
    if (err == 0) 
    { 
     match = regexec(&preg, str_request, nmatch, pmatch, 0); 
     nmatch = preg.re_nsub; 
     regfree(&preg); 
     if (match == 0) 
     { 
      printf("\"%.*s\"\n", pmatch[2].rm_eo - pmatch[2].rm_so, &str_request[pmatch[2].rm_so]); 
      printf("\"%.*s\"\n", pmatch[3].rm_eo - pmatch[3].rm_so, &str_request[pmatch[3].rm_so]); 
     } 
     else if (match == REG_NOMATCH) 
     { 
      printf("unmatch\n"); 
     } 
    } 
    return 0; 
} 
+0

プラス1.ありがとうWiktorStribiżew。それは私をたくさん助けました。敬具。 – CppLearner

+0

'regmatch_t pmatch [4]'と 'size_t nmatch = 4'はパターンに定義されているキャプチャグループの数によって決まることに気をつけてください:' 4' = 1 + '(...)' *キャプチャ*グループの量。 –

1

ワード境界リファレンス

General
POSIX


これらの構成体は、,[[:>:]]ではなく、クラスであることに注意してください。こと、およびBREとは対照的に、EREを使用して、あなたがこれを行うことができるはず考える

-

reti = regcomp(&regex,"[[:<:]](abc|def)[[:>:]]:[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);

または、[cf]間と:は自然ワード境界であるから、それはに減少させることができます

reti = regcomp(&regex,"[[:<:]](abc|def):[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);

私はこれをテストしていませんが、それはおそらく動作します。
が内部で何を行うかについては、が不明であることを考えれば、
の方がこの構文を守るほうがよいかもしれません。 POSIXオプションを持ってブースト\<に構文をカスタマイズし、\>

関連する問題