Forum: Cfengine Help
Subject: Re: Cfengine 3.1.4 and replace_patterns
Author: zzamboni
Link to topic: https://cfengine.com/forum/read.php?3,20414,20420#msg-20420
Nakarin's response is right, and the reason is the same I mentioned the other
day in this thread, namely:
(?! ...) is a zero-width negative look-ahead assertion. Since it's zero-width,
it ensures that the text inside the assertion is not present at that point, but
it does not actually match that text (it does not consume any characters in the
string). In this case, your original regex:
"^D\{MTAHost\}\[(?!$(g.mailrelay))\].*$"
Would ensure that the value of $(g.mailrelay) does not appear after the bracket
(as you intended), but it does not actually consume the "not-matched" text, so
the closing bracket would be expected to come immediately after the opening
bracket. In effect, this regex would only match the string "D{MTAHost}[]".
By adding the ".*" immediately after the negative look-ahead assertion,
Nakarin's version allows for any text to follow the opening bracket, thus
consuming the "text that does not match $(g.mailrelay)" (I know, it can get
confusing). To make it even more precise, you may want to add the closing
bracket after the ".*", like this:
"^D\{MTAHost\}\[(?!$(g.mailrelay)).*\]"
(this would be relevant only if there is some text that may come in the line
after the closing bracket, and that you would like to preserve. If this is the
case, you would be even safer using the non-greedy version of the regex ".*?")
More details:
http://www.regular-expressions.info/lookaround.html
http://perldoc.perl.org/perlre.html#Look-Around-Assertions
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine