/^((\d+[%@]?)|(x\d+)|(\d+x\d+[!^<>@]?))$/

That’s what I got. Anything better? Holla at me!

Update

Looks like Thoughtbot uses this matcher in paperclip:

# Parses a "WxH" formatted string, where W is the width and H is the height.
def self.parse string
  if match = (string && string.match(/\b(\d*)x?(\d*)\b([\>\<\#\@\%^!])?/i))
    Geometry.new(*match[1,3])
  end
end