正则表达到Grab City,State,Zip

时间:2011-04-03 12:13:28

标签: ruby regex

尝试创建一个可以处理输入的正则表达式:

  1. 加利福尼亚州比佛利山庄
  2. Beverly Hills,CA 90210
  3. 我有这个:

    ^(.+)[,\\s]+(.+)\s+(\d{5})?$
    

    它适用于#2案例,但不适用于#1。如果我将\s+更改为\s*,那么它适用于#1但不适用于#2。

    您可以在此处使用它:http://rubular.com/r/oqKBJ4r8cq

4 个答案:

答案 0 :(得分:6)

请改为尝试:

^([^,]+),\s([A-Z]{2})(?:\s(\d{5}))?$

此表达式适用于这两个示例,在不同的组中捕获每个地址,并正确处理空格。

以下是它如何分解:

^           # anchor to the start of the string
([^,]+)     # match everything except a comma one or more times
,           # match the comma itself
\s          # match a single whitespace character
([A-Z]{2})  # now match a two letter state code 
(?:         # create a non-capture group
    \s        # match a single whitespace character
    (\d{5})   # match a 5 digit number
)?          # this whole group is optional
$           # anchor to the end of the string

答案 1 :(得分:6)

试试这个:

^(.+)[,\\s]+(.+?)\s*(\d{5})?$

http://rubular.com/r/qS0e5vAQnT

答案 2 :(得分:0)

["Beverly Hills, CA 90210", "Beverly Hills, CA"].each do |s|
  m = s.match(/^([^,]*),\s*(\w*)\s*(\d*)?$/)
  $1 # => "Beverly Hills", "Beverly Hills"
  $2 # => "CA", "CA"
  $3 # => "90210", ""
end

#=>注释显示两次运行的结果。

答案 3 :(得分:0)

((?:\w|\s)+),\s(AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)

这是一个只抓取有效state codes的长篇文章。