строка формата (почтовый индекс) в ruby - PullRequest
3 голосов
/ 08 апреля 2010

Мне нужно переформатировать список почтовых индексов Великобритании и начать со следующего, чтобы удалить пробелы и использовать заглавные буквы:

postcode.upcase.gsub(/\s/,'')

Теперь мне нужно изменить почтовый индекс, чтобы новый почтовый индекс был вформат, который будет соответствовать следующему регулярному выражению:

^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

Буду признателен за любую помощь.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

Если этому стандартному документу нужно верить (и Википедия совпадает ), форматирование правильного почтового индекса для вывода просто: последние три символа - вторая часть, все до это первая часть!

Итак, если у вас есть действующий почтовый индекс без предварительно встроенного пробела, вам просто нужно

def format_post_code(pc)
  pc.strip.sub(/([A-Z0-9]+)([A-Z0-9]{3})/, '\1 \2')
end

Если вы хотите сначала проверить введенный почтовый индекс, то приведенное вами регулярное выражение выглядит хорошей отправной точкой. Возможно, что-то вроде этого?

NORMAL_POSTCODE_RE = /^([A-PR-UWYZ][A-HK-Y0-9][A-HJKS-UW0-9]?[A-HJKS-UW0-9]?)\s*([0-9][ABD-HJLN-UW-Z]{2})$/i
GIROBANK_POSTCODE_RE = /^GIR\s*0AA$/i
def format_post_code(pc)
  return pc.strip.upcase.sub(NORMAL_POSTCODE_RE, '\1 \2') if pc =~ NORMAL_POSTCODE_RE
  return 'GIR 0AA' if pc =~ GIROBANK_POSTCODE_RE
end

Обратите внимание, что я удалил часть «0-9» первого символа, которая, согласно источникам, которые я цитировал, кажется ненужной. Я также изменил наборы альфа, чтобы соответствовать первому цитируемому документу. Он все еще не совершенен: например, проверяется код формата «AAA ANN», и я думаю, что, возможно, требуется более сложный RE.

Я думаю, что это может покрыть это (построено поэтапно для облегчения исправления!)

A1  = "[A-PR-UWYZ]"
A2  = "[A-HK-Y]"
A34 = "[A-HJKS-UW]"        # assume rule for alpha in fourth char is same as for third
A5  = "[ABD-HJLN-UW-Z]"
N   = "[0-9]"
AANN = A1 + A2 + N + N     # the six possible first-part combos
AANA = A1 + A2 + N + A34
ANA  = A1 + N + A34
ANN  = A1 + N + N
AAN  = A1 + A2 + N
AN   = A1 + N
PART_ONE = [AANN, AANA, ANA, ANN, AAN, AN].join('|') 
PART_TWO = N + A5 + A5

NORMAL_POSTCODE_RE = Regexp.new("^(#{PART_ONE})[ ]*(#{PART_TWO})$", Regexp::IGNORECASE)  
0 голосов
/ 08 апреля 2010

Почтовые индексы Великобритании не согласованы, но они конечны - вам может быть лучше с таблицей поиска.

0 голосов
/ 08 апреля 2010

Переформатирование или сопоставление с образцом? Я подозреваю, что последнее, хотя обгонять его - хорошая идея.

Прежде чем мы продолжим, я хотел бы указать, что вы убираете пробелы, но ваше регулярное выражение содержит "{1,2}", что означает "один или два пробела". Так как вы уже удалили пробелы, вы уже заставили всех провалить матч.

Учитывая почтовый индекс в качестве ввода, мы можем проверить, соответствует ли он регулярному выражению, используя = ~

Здесь мы создаем несколько примеров почтовых индексов (взятых со страницы википедии ) и проверяем каждый из них на соответствие регулярному выражению:

post_codes = ["M1 1AA", "M60 1NW", "CR2 6XH", "DN55 1PT", "W1A 1HQ", "EC1A 1BB", "bad one", "cc93h29r2"]
r = /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/

post_codes.each do |pc|
  # pc =~ r will return something true if we have a match (specifically the integer of first match position)
  # We use !! to display it as true|false
  puts "#{pc}: #{!!(pc =~ r)}"
end
M1 1AA: true
M60 1NW: true
CR2 6XH: true
DN55 1PT: true
W1A 1HQ: true
EC1A 1BB: true
bad one: false
cc93h29r2: false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...