2017-10-31 14 views
1

正規表現はどのように書くのですか?正規表現の部分IP

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <regex.h> 
int main() { 
regex_t regex; 
int reti; 
char msgbuf[100]; 
const char *regIp = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?){0,1}$"; 
reti = regcomp(&regex, regIp, 0); 
regerror(reti, &regex, msgbuf, sizeof(msgbuf)); 
printf("Regex compile: %s.", msgbuf); 
reti = regexec(&regex, "192.168.100", 0, NULL, 0); 
if (!reti){ 
    puts("MUTCH!!"); 
    } else if (reti == REG_NOMATCH) { 
    puts("No mutch"); 
    } else { 
    regerror(reti, &regex, msgbuf, sizeof(msgbuf)); 
    printf("Regex match failed: %s.", msgbuf); 
    } 
} 

は私はありませんmutchを持っています。

私は

^\\(?:\\(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\\)\\.\\)\\{1,3\\}\\(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\\)\\{0,1\\}$ 

ではなく、再び一致するよう、マスクの中括弧を試してみてください。

ありがとうございます。

+0

'regcomp'メソッドに' REG_EXTENDED'を渡し、ドットを2つのバックスラッシュでエスケープする必要があります。 –

+0

REG_EXTENDEDの代わりに1を入れてセグメンテーションフォールト Irbis

+0

https://ideone.com/cuQNbSを参照してください。 POSIX正規表現は非キャプチャグループをサポートしていないので、キャプチャしていないグループを*キャプチャしたグループに置き換える必要があります。 –

答えて

2

REG_EXTENDEDregcompを使用し、.より前のバックスラッシュを倍にします。

regIp初期化と

const char *regIp = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\\.){1,3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)?$"; 
reti = regcomp(&regex, regIp, REG_EXTENDED); 
// => Regex compile: Success.MATCH!! 
を使用してコード内の reti割り当て

REG_EXTENDEDC demo

を参照してくださいとの2行を置き換え、POSIX ERE構文が({m,n}数量詞ができるようにパターンに許可されます中括弧をエスケープせずに使用することができます)、また$の使用を許可します。リテラル正規表現エスケープ\は、Cの文字列リテラルに二重バックスラッシュで定義する必要があります。

POSIX正規表現は非キャプチャグループをサポートしていないので、非キャプチャグループをと置き換える必要があることに注意してください。をキャプチャします。したがって、(?:...)はすべて(...)に変更する必要があります。

+1

ありがとう!!それは私の仕事です! 明確化のために特別なことをありがとう! – Irbis