私は正規表現をシェルで使用していますが、C言語のプログラムでは動作しません。RegexはC言語で動作していません
何か考えてください。
echo "abc:[email protected]" | grep -E "(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)" //shell
reti = regcomp(®ex,"(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)", 0); //c program
私は正規表現をシェルで使用していますが、C言語のプログラムでは動作しません。RegexはC言語で動作していません
何か考えてください。
echo "abc:[email protected]" | grep -E "(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)" //shell
reti = regcomp(®ex,"(\babc\b|\bdef\b):[0-9]{10}@([A-Za-z0-9].*)", 0); //c program
grep -E
は(もと(
と)
){n,m}
数量詞の中括弧をエスケープする必要がないことを意味するいくつかの拡張ERE構文(BREの正規表現ではない場合)を使用しています。あなたは、ワード境界を使用する最初の\b
(^|[^[:alnum:]_])
と「同等」を置き換えることはできませんので、
あなたは、またregcomp
にREG_EXTENDED
フラグを渡して、する必要があります。 (^|[^[:alnum:]_])
部分が文字列(^
)の開始または(|
)英数字またはアンダースコア以外の文字のいずれかと一致する
const char *str_regex = "(^|[^[:alnum:]_])(abc|def):[0-9]{10}@([A-Za-z0-9].*)";
::
が右後のパターンでありますので、あなたは何の末尾\b
を必要としません。
:
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;
}
プラス1.ありがとうWiktorStribiżew。それは私をたくさん助けました。敬具。 – CppLearner
'regmatch_t pmatch [4]'と 'size_t nmatch = 4'はパターンに定義されているキャプチャグループの数によって決まることに気をつけてください:' 4' = 1 + '(...)' *キャプチャ*グループの量。 –
ワード境界リファレンス
。
これらの構成体は、,[[:>:]]
がではなく、クラスであることに注意してください。こと、およびBREとは対照的に、EREを使用して、あなたがこれを行うことができるはず考える
-
reti = regcomp(®ex,"[[:<:]](abc|def)[[:>:]]:[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);
または、[cf]
間と:
は自然ワード境界であるから、それはに減少させることができます
reti = regcomp(®ex,"[[:<:]](abc|def):[0-9]{10}@([A-Za-z0-9].*)", REG_EXTENDED);
私はこれをテストしていませんが、それはおそらく動作します。
が内部で何を行うかについては、が不明であることを考えれば、
の方がこの構文を守るほうがよいかもしれません。 POSIXオプションを持ってブースト、\<
に構文をカスタマイズし、\>
'grepの-E'は(私はいくつかの機能強化と、それはEREに近いと思います)ERE構文を使用していますよう
いくつかのエンジン。 'regcomp'に' REG_EXTENDED'フラグを渡してください。それでも、 '\ b'が' regex.h 'でサポートされているかどうかわかりません。 –
Cバージョンでは、C文字列の中に単一のバックスラッシュを使用しています。これらのバックスラッシュは正規表現ライブラリに渡されないので、うまくいきません。 (どちらですか?) – usr2564301