冒号的正则表达式超前但忽略替换
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 后跟一个等号.然后它匹配另一组可能的括号(跳过),并继续到行尾。
注意事项:如果在冒号后的或前有不止一组括号,则无效。虽然可以通过复制圆括号来添加更多的组 ;) 但我不认为目的是看看我们可以制作一个正则表达式有多复杂 ;)
我正在尝试检测 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 后跟一个等号.然后它匹配另一组可能的括号(跳过),并继续到行尾。
注意事项:如果在冒号后的或前有不止一组括号,则无效。虽然可以通过复制圆括号来添加更多的组 ;) 但我不认为目的是看看我们可以制作一个正则表达式有多复杂 ;)