/*** TIP 00390 ***/
Does anyone have a suggestion for parsing/extracting multiple email addresses 
from a text field?  Examples of the data have been entered include:

Name@MSN.COM  Name@NC.RR.COM
Name@NCOL.NET...Name@ncol.net
name@msn.com, name@msn.com
name@aol.com//name2022@nc.rr.com
name@peoplepc.com/name.1@netzero.net
name@BASF-CORP.COM or name20@msn.com
name's@cs.com  name-name.place@btitelecom.net


Solution by Harry Droogendyk with some additional suggestions by Howard Schreier /*** use the translate / tranwrd functions to ensure the delimiting character is space, then use scan to rip it apart. Some clean up remains but this is enough to get you going.***/ data addresses (drop = _: ); length email_addr $100; _a = "Name@MSN.COM Name@NC.RR.COM Name@NCOL.NET...Name@ncol.net name@msn.com, name@msn.com name@aol.com//name2022@nc.rr.com name@peoplepc.com/name.1@netzero.net name@BASF-CORP.COM or name20@msn.com name's@cs.com name-name.place@btitelecom.net Name@NCOL.NET....Name@ncol.net Name@xoryorz.com"; _a = translate(_a,' ','/,'); _a = tranwrd(_a,' or ',' '); /*** added by Howard Schreier ***/ /*** Notice the blanks surrounding the word "or"; important since "or" alone could occur within an address.***/ *** _a = compbl(tranwrd(_a,'..',' ')); /*** replaced with Howard Schreier suggestion ***/ _a = tranwrd(compbl(tranwrd(_a,'..',' ')),' .',' '); /*** added by Howard Schreier ***/ /*** The multiple dots are tricky, since of course dots appear within addresses. I would wrap another TRANWRD invocation around Harry formula.***/ put _a=; do until(0); _i + 1; email_addr = scan(_a,_i,' '); if missing(email_addr) then leave; if index(email_addr,'@') then output; end; run; proc print; run; /*** end of tip 00390 ***/