我需要重新格式化英国邮政编码列表,并开始使用以下内容删除空白并大写:
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)$
我将不胜感激。
答案 0 :(得分:3)
如果要相信this standards doc(和维基百科concurs),格式化输出的有效邮政编码很简单:最后三个字符是第二部分,之前的所有内容都是第一部分!< / p>
假设你有一个有效的邮政编码,没有任何预先嵌入的空间,你只需要
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'部分,根据我引用的来源,这似乎是不必要的。我还更改了alpha集以匹配首次引用的文档。它仍然不完美:例如,'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)
答案 1 :(得分:0)
重新格式化还是模式匹配?我怀疑后者,虽然首先提升它是一个好主意。
在我们开始之前,我会指出你正在剥离空格,但你的正则表达式包含“{1,2}”,即“一个或两个空格字符”。由于你已经剥离了空白,你已经让所有人都失败了。
给定一个后置代码作为输入,我们可以使用=〜
检查它是否与正则表达式匹配这里我们创建一些示例邮政编码(取自wikipedia page),并针对正则表达式测试每一个:
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
答案 2 :(得分:0)
英国邮政编码不一致,但它们是有限的 - 使用查找表可能会更好。