#!/usr/bin/perl use strict; use warnings; my @string = ( 'aaa_fgjkghd11__hfksdh11__0000', 'aaa_fgjkghd11_hfksdh11__0000', 'aaa_fgjkghd11hfksdh11__0000', 'aaa_fgjkghd11__hfksdh11_0000', 'aaa_fgjkghd11__hfksdh110000', 'aaa_fgjk__ghd11_hfksdh1_10000', 'aaa_fgjk__ghd11_hfksdh1_0000', 'aa_fgjk__ghd11_hfksdh1_a000', 'aaa_fgjk_ghd_11_hfksdh1_0000' ); for (@string) { print /\A a{3} [_] (?: [a-z0-9] | [^_][_] ){1,24} [^_][_] \d{4} \z /xms ? ' ' : 'no '; print "match : $_\n"; } #### no match : aaa_fgjkghd11__hfksdh11__0000 no match : aaa_fgjkghd11_hfksdh11__0000 no match : aaa_fgjkghd11hfksdh11__0000 no match : aaa_fgjkghd11__hfksdh11_0000 no match : aaa_fgjkghd11__hfksdh110000 no match : aaa_fgjk__ghd11_hfksdh1_10000 no match : aaa_fgjk__ghd11_hfksdh1_0000 no match : aa_fgjk__ghd11_hfksdh1_a000 match : aaa_fgjk_ghd_11_hfksdh1_0000