2009-10-27 15 views
14

私はcを見てから10年経ちました。私は文字列を解析する小さなプログラムを書く必要があります。正規表現は何年も使用してきたので使ってみたいですが、cでそれをどうやって行うのか分かりません。私は朝のグーグルを過ごしましたが、まっすぐな例は見つけられません(つまり、このライブラリを使用してください、これは方法論です)。誰かが私に簡単な例を教えてもらえますか?c正規表現howto

ありがとうございます!

答えて

38

あなたはPCRE使用することができます。PCREライブラリはPCREは独自のネイティブAPIを持っていたPerl 5と同じ構文とセマンティクスを使用して一致する正規表現パターンを実装する関数のセットとしてだけでなく、

ですPOSIX正規表現APIに対応するラッパー関数のセット。 PCREライブラリは商用ソフトウェアを構築する場合でも無料です。

PCREの例については、pcredemo.cを参照してください。

PCREを使用できない場合は、おそらくPOSIX regular expressionのサポートがご利用いただけます(as @tinkertim pointed out)。 Windowsの場合はgnuwin Regex for Windows packageを使用できます。

regcompマニュアルは、次の例が含まれます。ネイティブCライブラリのほか

#include <regex.h> 

/* 
* Match string against the extended regular expression in 
* pattern, treating errors as no match. 
* 
* Return 1 for match, 0 for no match. 
*/ 

int 
match(const char *string, char *pattern) 
{ 
    int status; 
    regex_t re; 

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { 
     return(0);  /* Report error. */ 
    } 
    status = regexec(&re, string, (size_t) 0, NULL, 0); 
    regfree(&re); 
    if (status != 0) { 
     return(0);  /* Report error. */ 
    } 
    return(1); 
} 
+0

+1なしタイプ 「男のregcomp」、POSIXは存在しないものの、PCREは、ほぼすべての近代的なシステムで使用可能です。 –

+0

ありがとう!私に素敵な出発点を与えます。 – jeffkolez

+0

これは素晴らしい、便利で協力的な答えです。私はこの質問がより多くの票を受け取ることを願っています.Cの正規表現はプラットフォームによっては難しいかもしれません。 –

0

別のオプションは、PythonやPerlなどの他の言語へのインターフェイスを使用することです。 Cの文字列処理に対処する必要はなく、regexの言語サポートが優れているため、作業がはるかに容易になります。あなたはまた、POSIXのみ(PCRE)に強制した場合C.

+0

別のプログラムへのシェルリングは、絶対にタスクを達成する唯一の方法でない限り、決して良い考えではありません。 –

+0

@ NathanAdamsこの答えの中には、別のプログラムへの砲撃についてのものはありません。 – hobbs

6

からコードを呼び出すためのラッパーを生成するためにSWIGのようなツールを使用することができ、ここでは秋のちらほらは背中:

#include <regex.h> 
#include <stdbool.h> 

bool reg_matches(const char *str, const char *pattern) 
{ 
    regex_t re; 
    int ret; 

    if (regcomp(&re, pattern, REG_EXTENDED) != 0) 
     return false; 

    ret = regexec(&re, str, (size_t) 0, NULL, 0); 
    regfree(&re); 

    if (ret == 0) 
     return true; 

    return false; 
} 

あなたはそれを呼ぶかもしれませんこのように:

int main(void) 
{ 
    static const char *pattern = "/foo/[0-9]+$"; 

    /* Going to return 1 always, since pattern wants the last part of the 
    * path to be an unsigned integer */ 
    if (! reg_matches("/foo/abc", pattern)) 
     return 1; 

    return 0; 
} 

私は非常にをその利用可能な場合はPCREを使用することをお勧めします。しかし、それはそれをチェックし、いくつかの種類の秋を戻していいです。

現在、私のエディタにあるプロジェクトからスニペットを取り出しました。その非常に基本的な例ですが、あなたが必要とする場合には、タイプアップして検索するための関数を提供します。この答えは、多かれ少なかれ、シナンの答えを増強する。

+0

ありがとう - 良い例。私は環境がまだ分からないので、PCREが利用できない場合に備えてバックアップを取るのが便利です。 – jeffkolez

+1

@jeffkolezあなたのプロジェクトには幸運があります。あなたがCに触れてから10年。ここであなたはその暗いコーナーの一つにいます。あなたのコンピュータを撃つことを選ぶ場合は、まずNERF銃を購入することを検討してください。 –

0

正規表現のライブラリも見てください。 Linuxシェルに書き込むことのできる正規表現を使用します。 Linuxでのより多くの情報については、

、引用符

+0

これは、他の回答で既に利用可能なものに新しい情報を追加するものではありません。 –