my $str = q|{RP}makaravilYakkin Sabarimala ayyappanu cArZwwAnulYlYa wiruviwAMkUrZ rAjAvAyirunna SrI ciwwirawirunnAlYZ bAlarAmavarZmma natakk vacca 420 kilogrAM wUkkamulYlYa wafkayafki{/RP}{MCL} sUkRikkunnaw I kRewrawwilAN.{/MCL}|; while ($str =~ m[ {(\w+)} # a word within {}, capture it \W* # maybe non-word chars (\w+) # first word after tag, capture it [^{]+ # anything but a {, up to... \W # a non-word character (\w+) # last word before tag, capture it \W* # maybe non-word chars {/\1} # ending tag matching captured one above ]xg){ print "$1 $2 $3\n"; # print captured values }