in reply to String with multiple underscores

TIMTOWTDI:
use strict; while (<DATA>) { next unless /^(?:MS_|TS_|BP_|Dummy_)/; next unless /(?:_0001|_025f|_0001_[[:alnum:]]{4})$/; print +(split '_')[1],"\n"; } __DATA__ MS_11BT801_AQHT801_0001 TS_11BT801_AUBT801_0001 BP_11BT801_C2DT801_0001 BP_11BT801_DNWT801_025f Dummy_11BT801_CPZT801_3h81 MS_C2DT801_PU7T801_0001_678b TS_C2DT801_RAYT801_0001_7d18 BP_CJBT801_NKRT802_0001_a6d8
Output:
11BT801 11BT801 11BT801 11BT801 C2DT801 C2DT801 CJBT801
If by "ends with one of _0001, _025f(alphanumeric)" you mean that the string could end in any 4 alfanumerics (and not specifically _0001 or _025f) you can simplify the second regex to
/[[:alnum:]]{4}$/

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James