私はこのような文字列を持っています:
"result is abcdefg hij!klm </td"
(または abcd... の代わりに他のすべて)
私が作った正規表現は次のとおりです。
"result is ([^<]+) </td"
結果が見つかるので、これはうまく機能します。しかし、文字列が次の場合:
"result is not found </td"
...「見つかりません」という単語を抽出しないようにするにはどうすればよいですか?
否定的な先読み式があることは知っていましたが、これらは C99 の regex.h では機能しません。
"(?!not found)"
-> 悪い正規表現"([^n][^o][^t][^ ][^f]..)"
-> 「今」と一致しません。たとえば、"(([^<]+)&(!not found))"
-> 悪い正規表現
(「&」演算子はありません。解決策は次のようになると思いますa&&b == !a||!b
:)
--EDIT--
ここでは、正規表現を計算するコードの一部です。
pmatch=malloc(nmatch*sizeof(regmatch_t));
printf("regex: %s\n",patrn);
if (regcomp(&rgT,patrn,REG_EXTENDED | REG_NEWLINE) != 0)
{
snprintf(globals.err_buff,MAX_BUFF,"bad regex: \"%s\"",patrn);
w_report_error(globals.err_buff,__FILE__,__LINE__,__func__,0,0,error);
return EXIT_FAILURE;
}
-- 編集 --
解決策を見つけたかもしれません:
私自身の正規表現関数は、パラメータとして 0 より大きい数値を渡すと N 番目の後方参照を返すため、...
注: ./regex
argv[...] をリダイレクトする C プログラムのみです。自分のライブラリの w_regexp に。
$ ./regex "result is crack </td" 'result is (not found) </td|result is ([^<]+) </td' 3
regex: result is (not found) </td|result is ([^<]+) </td
"crack"
""
"result is crack </td"
$ ./regex "result is not found </td" 'result is (not found) </td|result is ([^<]+) </td' 3
regex: result is (not found) </td|result is ([^<]+) </td
""
"not found"
"result is not found </td"
したがって、データを抽出するために使用する後方参照のインデックスが解決策になる可能性があることを意味する数値を構造体に追加すると思いますが、これに対するより良い方法を別の日または 2 で待っています
。 .
--EDIT-- (あまりにも多くの場合:))
動作します! フォロワーを避けたい文字列を「|」で入れました 正しい文字列のパターン。
これが正規表現です。
"result is not found </td|result is ([^<]+) </td"
ありがとうございます。