1

2printk種類の関数呼び出しを考えてみましょう-

TRACE_BR(TRACE ,    "END. rc = %d\n", rc );

TRACE_BR(TRACE, "Value = %s", string );

%文字列引数の内部にある上記のような関数呼び出し全体に一致する正規表現を作成していますが、文字列ENDも内部にある場合は一致しないはずです。

私はこのようにネガティブ先読みを使用しました

TRACE_BR\(TRACE.*?(?!END)%.*

この正規表現は2番目の関数呼び出しにのみ一致すると思いますが、最初の関数呼び出しにも一致します。

私は貪欲な*部分でどこかで間違っていると思います。

4

1 に答える 1

6

正規表現は次のようになります。

TRACE_BR\(TRACE(?!.*END).*?%.*

ENDの後に現れる部分文字列の場合、この正規表現は行と一致しませんTRACE。より洗練されたマッチングが必要な場合は、正規表現を変更する必要があります。

正規表現は次のように考えることができます。一致した後TRACE(および前など)、現在の位置から、部分文字列が見つからないことを先読みしたいと思いますEND

正規表現では、負の先読みアサーションの後の文字がである場合、サブストリングはそこから開始できないため%、アサーションは常にtrueです。END否定的な先読みアサーションの後の文字がそうでない%場合、正規表現は一致およびバックトラックに失敗します。

を削除するという架空のケースでは%、正規表現はENDのある文字列を通過させます。これは、任意の文字のシーケンスにより.*?、途中の任意の位置でネガティブルックアヘッドが一致するようになり、次の位置を見つけることができるためです。文字列の先頭ではなく、文字列ENDと一致します。

于 2012-12-03T07:14:59.977 に答える