my $string = q/the users contain (bbc (333)) BLAH BLAH (ddc (223)) BLAH BLAH(ccc (123))/; my $re = qr/ \( (? [^(]+ ) # Capture name. \( (? [^)]+ ) # Capture ID. \)\) # Closing parens. /x; print "Name: $+{name}, ID: $+{id}\n" while $string =~ m/$re/g;