in reply to String extract 2

You can use a negated character class to match up until the included chars in the class are found.

#!/usr/bin/env perl use strict; use warnings; use feature 'say'; my @test_cases = ( 'KP_what_I_want(but_not_this', 'KP_what_I_want nor_this', 'KP_ nor_any_of_this', 'and this will not match', ); for my $line (@test_cases) { my ($exp) = $line =~ m/ KP_ # Required. ( [^ (]* ) # Capture until space # or left paren. /xi; if (defined $exp) {say "<$exp>"} else {say 'NO MATCH'}; } __END__ <what_I_want> <what_I_want> <> NO MATCH