Having said that I still think that lookahead and lookbehind are the best bet.
Just join them like this instead:
$total_raw = "(" . # WRONG join ("|", map ( "(?<!\Q$pre[$_]\E)ALPHA(?!\Q$suf[$_]\E)", (0..$#pre) ) ) . ")"; $total_rx = qr/$total_raw/;
(untested) Or something like that.
Update: Dooh. That doesn't work. Need an "and" match not an "or" match. Hmmmm... back to the drawing board.
Update: Okay, I've got it...
Can you nest lookaheads and lookbehinds? If so this should work:
$total_raw = "(?!(" . # CORRECT, MAYBE join ("|", map ( "(?<=\Q$pre[$_]\E)ALPHA(?=\Q$suf[$_]\E)", (0..$#pre) ) ) . "))ALPHA"; $total_rx = qr/$total_raw/;
This has a zero-width assertion followed by ALPHA.
The zero-width assertion is a lookahead exclude (ie looking ahead, that this is not true)
What it is looking ahead to see is one of multiple patterns.
Each pattern contains an ALPHA with a lookahead and behind for an excluded suffix and prefix pair. If one of these matches, we have an excluded alpha - so we exclude this match (the original zero-width assertion).
So it says: match an ALPHA that does not have an excluded prefix/suffix.
-Andrew.
In reply to Re^2: Pattern matching when there are exception strings
by tomazos
in thread Pattern matching when there are exception strings
by Moron
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |