in reply to substitution with exceptions
Perhaps a bit more fancy than necessary, but a lot is factored out. Needs Perl version 5.10+ for (*SKIP) (*FAIL) (see Special Backtracking Control Verbs in perlre):
c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; my $text = q{x aren't y ain't z isn't w won't u 't v daren't t}; print qq{'$text'}; ;; my $sq_t = qr{ 't }xms; my $skip_sq_t = qr{ aren | isn }xms; ;; my $exceptions_sq_t = qr{ \b $skip_sq_t $sq_t (*SKIP) (*FAIL) }xms; ;; $text =~ s{ $exceptions_sq_t? (?<= [[:alpha:]]) (?= $sq_t) }{ }xmsg; print qq{'$text'}; " 'x aren't y ain't z isn't w won't u 't v daren't t' 'x aren't y ain 't z isn't w won 't u 't v daren 't t'
Update: Another, more highly factored approach. See haukex's article Building Regex Alternations Dynamically for more info on how the $exception_n_sq_t regex is built. Something like this could be used to manufacture countless target/exception regex pairs.
c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; my $sq_t = qr{ 't }xms; ;; my $target_n_sq_t = qr{ (?<= [[:alpha:]]) (?= $sq_t) }xms; ;; my ($exception_n_sq_t) = map qr{ \b (?: $_) n $sq_t (*SKIP) (*FAIL) }xms, join q{ | }, qw(are is) ; print $exception_n_sq_t; ;; my $text = q{x aren't y ain't z isn't w won't u 't v daren't t}; print qq{'$text'}; ;; $text =~ s{ $exception_n_sq_t? $target_n_sq_t }{ }xmsg; print qq{'$text'}; " (?msx-i: \b (?: are | is) n (?msx-i: 't ) (*SKIP) (*FAIL) ) 'x aren't y ain't z isn't w won't u 't v daren't t' 'x aren't y ain 't z isn't w won 't u 't v daren 't t'
Give a man a fish: <%-{-{-{-<
|
|---|