use strict; use warnings; use Data::Dumper; my $str1 = q!AND (random text) AND (more random text) AND (yet more)!; my $str2 = q!OR (random text) OR (more random text) OR (yet (more))!; for ( $str1, $str2 ) { my @texts = grep $_ # filter out empty strings , split / (?:\)\s|^) # either closing parentheses or start of string (?:AND|OR)\s\( # followed by AND or OR and opening parentheses | # or \)$ # closing parentheses at end of string /x; print Dumper \@texts; }