2017-05-12 35 views
1

我試圖檢測一個Makefile中的行是否是「規則」的開始。規則的語法爲<rule-name> : <rule-prerequisities>。那麼,容易吧?我只向前看一個冒號:正則表達式冒號,但忽略替換

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

負前瞻是有變量賦值來區分。他們可以有形式FOO := foo

不過,現在我也有這樣的事情:

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

這裏變量FOO進行評估,但每.c發生替換.o。現在它會檢測到這是一條規則,但是以「錯誤」的方式。

問題是由這一行進一步加劇:

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

這裏,先行相匹配,因爲它找到不跟一個冒號等號。

基本上,我需要做的是我需要向前看冒號,但忽略變量替換內的任何內容。

TL; DR:我如何向前看冒號但忽略變量替換?

regex101 link here,我想匹配除最後三行外的所有內容。

+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 
$ 

這兩條未註釋的行最多可以嵌套四個級別的括號。如有必要,可以擴展到更多層面。

它將字符串的開頭匹配到可能的括號組,然後「跳過」,然後繼續冒號而不是後跟等號。然後它匹配另一組可能的圓括號(跳過),並繼續到行尾。注意事項:如果在冒號之後的之前有多組括號,它將不起作用。更多的小組可以通過複製括號內容來添加);但是我不認爲其目的是看看我們能夠製作正則表達式有多複雜;)

Update to your example at regex101 here