3

英国の郵便番号のリストを再フォーマットする必要があり、空白を取り除き、大文字にするために、次のことから始めました。

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)$

どんな援助にも感謝します。

4

3 に答える 3

3

この標準ドキュメントを信じる(そしてウィキペディアが同意する)場合、出力用の有効な郵便番号のフォーマットは簡単です。最後の3文字は2番目の部分であり、前のすべてが最初の部分です。

したがって、事前に埋め込まれたスペースがなく、有効な郵便番号があると仮定すると、必要なのは

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)  
于 2010-04-08T13:25:14.303 に答える
0

再フォーマットまたはパターンマッチ?最初に大文字にするのは良い考えですが、私は後者を疑っています。

先に進む前に、スペースを削除していますが、正規表現には「1 つまたは 2 つのスペース文字」である「{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
于 2010-04-08T11:53:03.377 に答える
0

英国の郵便番号には一貫性がありませんが、有限です。ルックアップ テーブルを使用したほうがよい場合があります。

于 2010-04-08T11:55:04.463 に答える