0

OK ...この正規表現で動作するようになりました:

const char * reg_exp = "^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*@([a-z0-9])"
                       "(([a-z0-9-])*([a-z0-9]))+(.([a-z0-9])([-a-z0-9_-])?";

この表現がどれほど効果的かはまだわかりませんが、この問題が少しでも進展することをうれしく思います。


C パターン マッチング (正規表現) の新機能。私は自分の問題に対する答えを見つけようとしてきたと信じています。

登録モジュールで動作する単純な電子メール パターン マッチングを取得しようとしています。コード化したので、すべてのパスで適切にフォーマットされた電子メール ソースと一致しません。私の非常に限られた知識と理解に基づいて、他のすべての依存関係が満たされている場合、次のコードは機能するはずだと考えています。しかし、繰り返しますが、これは機能しません。どんな助けでも大歓迎です。

更新されたサンプル コード:

#include <regex.h>

regex_t regex;
... //other proc vars
int r, e;
unsigned char buf[RESBUF];
char *source = "johnnydoe@cloudnine.com";

const char *reg_exp1 = "/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@"
                       "([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|"
                       "edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])"
                       "|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i";
const char *reg_exp2 = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";

char proc[] = "create_user";

r = regcomp(&regex,reg_exp2,REG_EXTENDED);
if(r) {
     sprintf(emessage,"REGEX COMPILE:Fail:%s:%s",proc,cgiRemoteAddr);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
else {
     e = 0;
}
r = regexec(&regex,source,0,NULL,0); // source email
if(!r) {
     e = 0;
}
else
if(r == 1) {
     sprintf(emessage,"REGEX MATCH:Fail:%s",proc);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
else {
     regerror(r,&regex,buf,100);
     sprintf(emessage,"REGEX MATCH:Fail:%s:%s",proc,buf);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
regfree(&regex);
// Now evaluate e to determine success
if (!e) { ... }
4

3 に答える 3

0

この正規表現はそれを行います:\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\bあなたが使用しているドメインチェックなしで。ここでその説明を読んでください:http://www.regular-expressions.info/email.html

ドメインチェックを追加するには、最後は次のようになります。

\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.(ca|com|info|edu|...)\b

編集

簡単にするために、パターンをregcomp関数に直接渡してみてください。POSIXの例からこのコードを盗んだ:

reti = regcomp(&regex, "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", 0);
    if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }

/* Execute regular expression */
    reti = regexec(&regex, "johnnydoe@cloudnine.com", 0, NULL, 0);
    if( !reti ){
            puts("Match");
    }
    else if( reti == REG_NOMATCH ){
            puts("No match");
    }
    else{
            regerror(reti, &regex, msgbuf, sizeof(msgbuf));
            fprintf(stderr, "Regex match failed: %s\n", msgbuf);
            exit(1);
    }

リンク: http: //www.peope.net/old/regex.html

于 2013-01-29T07:23:18.267 に答える
0

最初のステップは、エラー処理を受け入れられるようにすることです。"REGEX MATCH:Fail:%s"事実上役に立たないエラー メッセージではなく、問題の内容を説明するエラー メッセージ ( 、didn't start with a lettermissing '@' signmultiple '@' charactersなどunrecognised top level domain) が必要です。これはデバッグにとって重要であり (たとえば、何かを見落としている場合)、ユーザー入力 (および不適切なユーザー入力に対するフィードバック) が関係している場合はさらに重要になる可能性があります。

エラー処理が受け入れられるようになると、理解、保守、および検証がはるかに簡単な、多くの小さい/自明な正規表現が得られます。より多くのコードになりますが、意味不明なコードではなく、適切なコードになります。

次のステップは、これらの小さい/自明な正規表現を、正規表現をまったく使用しない、より単純で高速なチェックに置き換えることによって、コードをさらに改善することです。すべての正規表現がなくなったら、正規表現を適切に使用していることがわかります。:-)

于 2013-01-29T10:45:03.633 に答える
0

C ソースでは、正規表現エンジンにバックスラッシュを認識させたい場合、文字列リテラルに 2 つのバックスラッシュが必要です。あなたの2つの簡単なものを取ります:

const char *reg_exp2 = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b";

もちろん、正規表現がファイルから読み取られる場合、ファイルに必要なバックスラッシュは 1 つだけです。重要なことは、正規表現エンジンに送信される文字列にバックスラッシュが含まれていることです。

ヒント:

  1. デバッグ時に、正規表現の入力文字列を出力します。
  2. コンパイラの警告に注意してください。GCC 4.7.1 は、2 番目の文字列について次のように述べています。

    x.c:1:24: warning: unknown escape sequence: '\.' [enabled by default]
    
于 2013-01-29T20:39:55.320 に答える