in reply to Look-Arounds in Regexes are Hard

I view

/(?:(?!$re).)*/s

as the equivalent of

/[^$chars]*/

except it can prevent the match of entire regexps instead of a choice of characters. I call it the common use of a negative lookahead. If you're using a negative lookahead, that construct will probably satisfy your needs.

Keep in mind that both expressions can successfully match 0 characters if not properly anchored.

I think it would be nice if /(?^$re)/ could be added as a shortcut to /(?:(?!$re)(?s:.)*/. It would be more readable, and it would help prevent the common misuse of negative lookahead (/(?!$re.*)/).

Update: Formatting.

Replies are listed 'Best First'.
Re^2: Look-Arounds in Regexes are Hard (Common Use of a Negative Lookahead)
by moritz (Cardinal) on Jul 24, 2009 at 09:06 UTC
    I really like that idea.

    There's just a minor point of bikeshedding: should it be (?s:.) instead of a simple dot?

    I can argue both ways: negated character classes include the newline (unless it's explicitly listed as excluded), and it becomes more predictable that way.

    On the other hand you gain more flexibility if respect the /s setting of the outer regex, allowing the caller to tweak its behaviour accordingly.

    The first point sounds more convincing to me, but I have to think a bit more about it.

      Fixed.