Если этому стандартному документу нужно верить (и Википедия совпадает ), форматирование правильного почтового индекса для вывода просто: последние три символа - вторая часть, все до это первая часть!
Итак, если у вас есть действующий почтовый индекс без предварительно встроенного пробела, вам просто нужно
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)