簡體   English   中英

在 oracle 中使用正則表達式驗證英國郵政編碼

[英]Validate UK postcode using regular expression in oracle

以下是有效郵政編碼列表:

A1 1AA
A11 1AA
AA1 1AA
AA11 1AA
A1A 1AA
BFPO 1
BFPO 11
BFPO 111

我試過(([AZ]{1,2}[0-9]{1,2})\\ ([0-9][AZ]{2}))|(GIR\\ 0AA)$但它不是在職的。 您能否幫助我進行正確的查詢以驗證所有郵政編碼格式。

首先,與其根據手頭的數據集進行猜測,不如讓我們看看英國的郵政編碼是什么

EC1V 9HQ

前一個或兩個字母是郵政編碼區域,它標識將處理郵件的主要皇家郵政分揀辦公室。 在這種情況下,EC 將前往倫敦的 Mount Pleasant 分揀辦公室。

第二部分通常只是一個或兩個數字,但對於倫敦的某些地區,它可以是一個數字和一個字母。 這是郵政編碼區,它告訴分揀辦公室郵件應該去哪個投遞辦公室。

這第三部分是扇區,通常只是一個數字。 這會告訴投遞辦公室郵件應該去往哪個地區或社區。

郵政編碼的最后一部分是單位代碼,它總是兩個字母。 這可以識別最多 80 個地址的組,並告訴投遞辦公室將投遞物品的郵政路線(或步行路線)。

消化那個...

  1. 1 或 2 個字母。
  2. 一個數字,也許是一個字母數字。
  3. 空間。
  4. “通常”是一個數字,但除此之外我找不到任何實例。
  5. 2個字母。
\A[[:alpha:]]{1,2}\d[[:alnum:]]? \d[[:alpha:]]{2}\z

我們不能使用\\w因為它包含一個下划線。

我在^$使用了更精確的\\A\\z ,因為\\A\\z匹配字符串的確切開頭和結尾,而^$匹配行的開頭和結尾。 $特別是容忍尾隨換行符。


當然,也有特殊情況。 XXXX 1ZZ 為各個海外領地,XXXX 一一列舉。

\A(ASCN|STHL|TDCU|BBND|BIQQ|FIQQ|PCRN|SIQQ|TKCA) 1ZZ\z

然后是一些非常特殊的情況。

  • GIR 0AA 為Girobank
  • 用於安圭拉的 AI-2640。
\A(AI-2640|GIR 0AA)\z

把它們放在一起變成一個大(...|...|...)亂七八糟的東西。 最好將查詢分成三部分構建,並將其與x修飾符放在一起以忽略空格。

REGEXP_LIKE(
    postcode,
    '\A
     (
      [[:alpha:]]{1,2}\d[[:alnum:]]?\ \d[[:alpha:]]{2}\z   |
      (ASCN|STHL|TDCU|BBND|BIQQ|FIQQ|PCRN|SIQQ|TKCA)\ 1ZZ  |
      (AI-2640|GIR\ 0AA)
     )
     \z',
    'x'
)

或者您可以讓基本的正則表達式不那么嚴格,並在第一部分接受 2-4 個字母數字。 那么只有安圭拉需要擔心的特殊情況。

\A([[:alnum:]]{2,4} \d[[:alpha:]]{2}|AI-2640)\z

不利的一面是,這會讓不存在的郵政編碼進入。 從好的方面來說,您不必為其他特殊情況不斷調整。 對於這種級別的過濾,這可能沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM