3

私はこのような文字列を持っています:

"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 番目の後方参照を返すため、...
注: ./regexargv[...] をリダイレクトする 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"
ありがとうございます。

4

2 に答える 2

0

Aztaroth の作品もresult is ((?!not found)[^<]+) </td- 違いは、彼は空の一致を登録し、私のものは一致を登録しないことです。

でテスト済み

result is abcdefg hij!klm </td
result is not found </td
result is not this </td
result is note this </td
result is ote this </td

編集:残念ですが、これは怠惰で少し悪いですが、正規表現を使用した2つのパスはどうですか? 最初は 'not found' での一致をチェックしますresult is (not found) </td。次に、一致しない元の正規表現を使用して、結果を取り除きます。

于 2012-05-29T07:56:58.973 に答える
0

多分何かのような"result is (?:not found)?([^<]+)</td"

于 2012-05-29T07:47:55.983 に答える