http://qs321.pair.com?node_id=649253


in reply to repeatedly delete words expressed in alternation from end of string [regexp]

First, wouldn't it be better to start with a list of words instead of a regex?

my @words = qw( SA NV LTD CO LLC );

So we'll need to build the regex programatically.

my ($re) = map qr/$_/i, join '|', map quotemeta, @words;

Using Regexp::List can greatly speed up the process.

use Regexp::List qw( ); my $re = Regexp::List->new(modifiers => 'i')->list2re(@words);

Now that we have the regex, let's avoid the fragility of 1 while s/// while properly removing spaces.

while (<>) { chomp; s/^ (?: $re \s+ )+//x; s/ (?: \s+ $re )+//xg; print("$_$/"); }

Note: You were using capturing parens ((...)) when you only needed non-capturing parens ((?:...)). Removing the need to capture greatly improves the speed of regexs.

Update: Oops, it could still leave spaces. Fixed.
Update: Added Regexp::List method.