my @strs = qw( ep_svr_1_abc_ZYX_! ep_svr_2_DEF_wvu_? ep_svr_3_GhI_tSr_# ep_svr_x_aaa_bbb__ xep_svr_2_ccc_ddd_x ep_svr_4_ee_ffff_y ); for(@strs) { print m< ^ ep_svr_ \d _ [A-Za-z]{3} _ [A-Za-z]{3} _ . \z >xi ? "valid pattern: $_\n" : "invalid pattern: $_\n"; } __output__ valid pattern: ep_svr_1_abc_ZYX_! valid pattern: ep_svr_2_DEF_wvu_? valid pattern: ep_svr_3_GhI_tSr_# invalid pattern: ep_svr_x_aaa_bbb__ invalid pattern: xep_svr_2_ccc_ddd_x invalid pattern: ep_svr_4_ee_ffff_y