2017-05-12 7 views
1

私はMakefileの行を検出しようとしていますが、 "ルール"の開始点です。ルールの構文は<rule-name> : <rule-prerequisities>です。そう、簡単ですね?私はコロンを先に見ていきます:コロンの正規表現先読みが置換を無視します

(?=[^:]+:(?!=)) 

変数の割り当てを区別するためには否定的な先読みがあります。彼らはフォームFOO := fooを持つことができます。ここでは、変数FOO

$(FOO:.c=.o) : baz 

が評価されていますが、すべての .c発生が .oに置き換えられます。

はしかし、今私はまた、このようなものを持っています。今、これはルールだが、間違った方法で検出されます。問題はさらに、この特定の行で配合されて

:ここ

ifneq ($(words $(subst :, ,$(CURDIR))), 1) 

それは続いていないコロンが等号見つけたので、先読みは、一致しました。

基本的に、私はコロンを先読みする必要がありますが、変数の置換内のものは無視します。

TL; DR:コロンを先読みするにはどうすればよいですか?変数の置換は無視しますか?

regex101 link here、私は最後の3行を除くすべてを一致させたいと思います。

+0

非常に単純な解決策は、これのいくつかのバージョンです: ':(?!=)(?!。*?\))'。それをチェックしてください[regex101](https://regex101.com/r/ZZRfbm/1)。これは、単にコロンをチェックし、等号が続くのではなく、閉じ括弧が続くことを確認します。 – ClasG

+0

'$(EXECUTABLE):$(OBJECTS)'のような行では動作しません。 – rwols

+0

TL; DR:RegExの代わりに適切なパーサを使用してください。 –

答えて

2

これはきれいではありませんが、うまくいくと思います。

^        # Start of line 
[^()\r\n]*      # Any number of non parentheses characters 
(?:\([^()\r\n]*(?:\([^()\r\n]*(?:\([^()\r\n]*(?:\([^()\r\n]*\))?[^()\r\n]*\))?[^()\r\n]*\))?[^()]*\))? 
[^()\r\n]*      # Any number of non parentheses characters 
:(?!=)       # Colon NOT followed by an equal-sign 
[^()\r\n]*      # Any number of non parentheses characters 
(?:\([^()\r\n]*(?:\([^()\r\n]*(?:\([^()\r\n]*(?:\([^()\r\n]*\))?[^()\r\n]*\))?[^()\r\n]*\))?[^()]*\))? 
[^()\r\n]*      # Any number of non parentheses characters 
$ 

2つのコメントアウトされていない行は、ネストされた括弧のレベルを最大4つまで使用できます。必要に応じてより多くのレベルに拡張することができます。

括弧の可能なグループまで文字列の先頭に一致し、それを「スキップ」してからコロンに続くに続けて等号を続けます。次に、可能な別のグループの括弧(スキップ)に一致し、行末まで続きます。

警告:コロンの後ろにまたはの前に複数のかっこのグループがある場合、機能しません。しかし、私は正規表現を作ることがどれほど複雑であるか見ることは目的ではないと思う。)

Update to your example at regex101 here

関連する問題