2

現在のテストケースに適切な正規表現を取得するのに問題があります。

テストケースの例:

#include <stdio.h>
#include <stdlib.h>
#include <foo_file.h>

int myint = atoi(foostring1);

float myfloat = atof(foostring2);

int myint2 = atoi(foostring3);

使用事例:

  1. 文字列には atof と
  2. 文字列には文字列 stdlib.h が含まれていません
  3. グループは関係ありません。文字列が存在するかどうかを知りたいだけです。

正規表現で

(?=^#include <stdlib.h>).*atof

ファイルに stdlib ヘッダーと atof が含まれているかどうかを確認できます。よく働く。ただし、次のような否定的な先読み正規表現を取得できないようです

(?!(?=.*^#include <stdlib.h>)).*(atoi)

上記の正規表現行を何時間も繰り返してみましたが、うまくいきません。

私が使用しているIDEの正規表現エンジンは、改行/改行文字全体のマッチングを許可し、使用したい正規表現パーサー/エンジンを選択できると仮定します(ただし、通常はperlを使用します)

4

1 に答える 1

2

問題は、文字列のどこからでも一致を開始できることです。特に、 の後 に一致を見つけてい#include stdlib.hます。その後、先読みはそれ以上見つけられずstdlib.h、一致は成功します。多くの正規表現フレーバー\Aは、複数行モードに関係なく、文字列の先頭 (およびそこのみ) に一致するように提供します。したがって、先読みで文字列全体を強制的に調べるには、次のようにします。

\A(?!.*^#include <stdlib[.]h>).*(atoi)

内部に別の先読みをネストする必要がないことに注意してください。

#includeまた、がの であっても、これは失敗することに注意してくださいatoi。これが望ましくない場合、基本的に 2 つの解決策があります。

.NET の正規表現を選択できる場合は、これを後読みに変えることができます。

(?<!^#include <stdlib[.]h>.*)atoi

他のフレーバーでは後読みが固定幅である必要があるため、これは許可されません。

これらの場合、文字列の先頭と の間のすべての位置で、atoiそれが の先頭をマークしていないことを確認する必要がありincludeます。

\A(?:(?!^#include <stdlib[.]h>).)*(atoi)

したがって、(?:...)グループは任意の文字をその特定の位置の先読みと一緒にグループ化し、全体が繰り返されます。

于 2013-08-13T19:32:05.250 に答える