Very good, but that can't be embedded into another regexp nicely. The equivalent to /[^$chars]*/ is /(?:(?!$re).)*/.
/[^$chars]*/ matches as many characters as possible, as long as none match the character class.
/(?:(?!$re).)*/ matches as many characters as possible, as long as no subsequence of them match the regexp.
A "few" example uses: Re^3: reg ex NOT, Re^3: Text::Balanced with nested / custom brackets, Re^2: regex for negating a sequence, Re: Regexp: Match anything except a certain word, Re^2: Regexp: Match anything except a certain word, Re: regex help please, Re: Extraneous behaviour of match variables, Re: How to split into paragraphs?, Re^3: How to split into paragraphs?, Re: text extraction question, etc.
Notes:
-
Keep in mind that both expressions can sucessfully match 0 characters if not properly anchored.
-
* can be replaced with other modifiers, like +, *?, {2}, etc.
-
This should be in the docs since it's a FAQ.
-
I think it would be nice if /(?:(?!$re).)*/ could be shortcutted to /(?^$re)/. It would be more readable, and it would help prevent the commmon misuse of negative lookahead (/(?!$re.*)/).
Updated: Fixed formatting, added stuff
| [reply] [d/l] [select] |
Sidhekin,
Very Nice!
I admit that look around assertions, non-capturing clusters, and local modifiers are not my strong suit so I learned a bit from this one-size-fits-all solution. It would be nice if you forgot you knew how to do that though and shared other examples.
| [reply] |