Thanks for a great snippet tye!!
I must admit that it took me a while to get my brain around merlyn's regex. But after breaking it down it made perfect sense. unixwizard point out that the code wouldn't work on the 'other' US states, but I think that can be modified by changing the (?:\s\w+)? bit to (?:\s\w+)*
Here is merlyn's regex broken down, with comments:

\G # when progressively matching a string
# with the 'g' flag
# you can use the \G anchor to 'hold' the postition
# just after the previous match
# helps regex remember where it left off
# allows you to go through a list efficiently
# without using split or looping
# Mastering Regular Expessions (p 236 - 240)
\s* # matches zero or more spaces that
# may come before before a name-value pair
(\w\w) # match two word characters (alphanumeric plus '_')
# parentheses assign matched letters to $1
# this is the state abbreviation
\s+ # match one or more spaces between name-value pair
(\w+ # match one or more word characters
(?: # ?: allows for cluster-only parentheses,
# no capturing and doesn't assign to $3
\s\w+ # match one space then one or many word characters
)? # match zero or one of these clusters
# allows match of state names with mulitple words
# ie New York, West Viginia
# does not match States with three words,
# like 'Northern Mariana Island'
# change trailing ? to * to match those '(?:\s\w+)*'
) # assigns state name to $2
/gx; # end of regex
# g flag for global search
# x flag to allow whitespace in regex
# might also want to use c flag
# c flag causes the match position to be retained
# following an unsuccesful match
# see: Effective Perl Programming (p.63)
#
# the complete regex looks like this:
#
# /\G\s*(\w\w)\s+(\w+(?:\s\w+)?)/g;
#