冒号的正则表达式超前但忽略替换

Regex lookahead for a colon but ignore substitutions

我正在尝试检测 Makefile 中的一行是否是 "rule" 的开头。规则的语法为 <rule-name> : <rule-prerequisities>。那么,容易吗?我只期待一个冒号:

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

否定前瞻是用来区分变量赋值的。它们的形式可以是 FOO := foo.

但是,现在我也有这样的事情:

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

此处评估了变量 FOO,但每个 .c 的出现都被替换为 .o。现在它会检测到这是一条规则,但是是以 "wrong" 的方式。

此特定行进一步使问题复杂化:

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

在这里,先行匹配,因为它找到了一个冒号后面没有等号。

基本上,我需要做的是先查找冒号,但忽略变量替换中的任何内容。

TL;DR: 我怎样才能向前看冒号但忽略变量替换?

regex101 link here,我想匹配除最后三行以外的所有内容。

这不是很好,但我认为它会起作用。

^                              # 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
$

两个未注释的行最多占用四层嵌套括号。如有必要,可以扩展到更多级别。

它匹配字符串的开头到一组可能的括号,"skipping",然后继续到冒号 not 后跟一个等号.然后它匹配另一组可能的括号(跳过),并继续到行尾。

注意事项:如果在冒号后的前有不止一组括号,则无效。虽然可以通过复制圆括号来添加更多的组 ;) 但我不认为目的是看看我们可以制作一个正则表达式有多复杂 ;)

Update to your example at regex101 here.