Regex в Grab City, штат, почтовый индекс - PullRequest
2 голосов
/ 03 апреля 2011

Попытка создать регулярное выражение, которое может обрабатывать ввод, например:

  1. Беверли-Хиллз, Калифорния
  2. Беверли-Хиллз, Калифорния 90210

это:

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

Это работает для случая № 2, но не № 1.Если я изменю \s+ на \s*, он будет работать для # 1, но не для # 2.

Вы можете поиграть с этим здесь: http://rubular.com/r/oqKBJ4r8cq

Ответы [ 4 ]

6 голосов
/ 03 апреля 2011

Попробуйте это:

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

http://rubular.com/r/qS0e5vAQnT

6 голосов
/ 03 апреля 2011

Попробуйте вместо этого:

^([^,]+),\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
0 голосов
/ 27 апреля 2012

((?:\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)

Вот длинный, который захватывает только действительные коды состояний .

0 голосов
/ 03 апреля 2011
["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

Комментарии # => показывают результаты для обоих прогонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...