Excuse me for being thick but suppose you had the exceptions '1ALPHA2' and '3ALPHA4'. Wouldn't $total_rx also exclude '3ALPHA2' and '1ALPHA4'? :) Or am I missing something?
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.
|