in reply to regexp: Mind-boggling negative assertions...

++stevieb for helpful suggestions. Also, Anonymous Monk makes a good point that a list of test cases would be very helpful. That is, the code that stevieb posted works for the cases that you have mentioned in your post and replies...but it may fail on other cases that you have failed to mention here.

This is a case where the YAPE::Regex::Explain module can be helpful (see item 9 in Basic debugging checklist).

Here is the YAPE::Regex::Explain output for your original regex:
The regular expression: (?-imsx:^https?://(?!www\.)robidu\.de/) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ^ the beginning of the string ---------------------------------------------------------------------- http 'http' ---------------------------------------------------------------------- s? 's' (optional (matching the most amount possible)) ---------------------------------------------------------------------- :// '://' ---------------------------------------------------------------------- (?! look ahead to see if there is not: ---------------------------------------------------------------------- www 'www' ---------------------------------------------------------------------- \. '.' ---------------------------------------------------------------------- ) end of look-ahead ---------------------------------------------------------------------- robidu 'robidu' ---------------------------------------------------------------------- \. '.' ---------------------------------------------------------------------- de/ 'de/' ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------
Here is the YAPE::Regex::Explain output for stevieb's regex:
The regular expression: (?-imsx:^https?://.*?\.?(?<!www\.)robidu\.de/) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ^ the beginning of the string ---------------------------------------------------------------------- http 'http' ---------------------------------------------------------------------- s? 's' (optional (matching the most amount possible)) ---------------------------------------------------------------------- :// '://' ---------------------------------------------------------------------- .*? any character except \n (0 or more times (matching the least amount possible)) ---------------------------------------------------------------------- \.? '.' (optional (matching the most amount possible)) ---------------------------------------------------------------------- (?<! look behind to see if there is not: ---------------------------------------------------------------------- www 'www' ---------------------------------------------------------------------- \. '.' ---------------------------------------------------------------------- ) end of look-behind ---------------------------------------------------------------------- robidu 'robidu' ---------------------------------------------------------------------- \. '.' ---------------------------------------------------------------------- de/ 'de/' ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

Replies are listed 'Best First'.
Re^2: regexp: Mind-boggling negative assertions...
by stevieb (Canon) on Aug 17, 2015 at 00:59 UTC

    Another really nice feature is use re 'debug';:

    #!/usr/bin/perl use warnings; use strict; use re 'debug'; "this" =~ /(?<!x)i?/;

    Output:

    Compiling REx "(?<!x)i?" Final program: 1: UNLESSM[-1] (7) 3: EXACT <x> (5) 5: SUCCEED (0) 6: TAIL (7) 7: CURLY {0,1} (11) 9: EXACT <i> (0) 11: END (0) minlen 0 Matching REx "(?<!x)i?" against "this" 0 <> <this> | 1:UNLESSM[-1](7) 0 <> <this> | 7:CURLY {0,1}(11) EXACT <i> can match 0 times out of 1 +... 0 <> <this> | 11: END(0) Match successful! Freeing REx: "(?<!x)i?"