2012-03-07 18 views
5

Ho un sito Web Asp.Net e voglio utilizzare un RegularExpressionValidator per verificare se un codice postale del Regno Unito è inglese (vale a dire che non è scozzese, gallese o irlandese).Espressione regolare solo per l'Inghilterra Codice postale

Dovrebbe essere possibile vedere se il codice postale è in inglese utilizzando solo le lettere del primo segmant (chiamato l'area del codice postale). In totale ci sono 124 aree di codice postale e this è una lista di loro.

Da questo elenco, le seguenti aree del codice postale non sono in Inghilterra.

  • ZE, KW, IV, HS, PH, AB, DD, PA, FK, G, KY, KA, DG, TD, EH, ML (Scozia)
  • LL, SY, LD, HR , NP, CF, SA (Galles)
  • BT (Irlanda del Nord)

l'input per l'espressione regolare possono essere l'intero codice postale, o potrebbe essere solo l'area codice postale.

Qualcuno può aiutarmi a creare un'espressione regolare che corrisponda solo se un determinato codice postale è l'inglese?

EDIT - Soluzione

Con l'aiuto di diversi manifesti sono stato in grado di creare la seguente espressione regolare che ho testato contro più di 1500 casi di test con successo.

^(AL | B | B [ABDHLNRS] | C [ABHMORTVW] | D [AEHLNTY] | E | E [CNX] | FY | G [LUY] | H [ADGPUX] | I [GM P] | JE | KT | L | L [AENSU] | M | ME | N | N [EGNRW] | O [LX] | P [ELOR] | R [GHM] | S | S [EGKLMNOPRSTW] | T [AFNQ RSW] | UB | W | W [ACDFNRSV] | YO) \ d {1,2} \ s? (\ D [\ w] {2})?

+0

Anche quanti codici ci sono per la Scozia, il Galles e l'Irlanda del Nord? Perché potrebbe essere più facile associare i negativi ai positivi a seconda dei numeri. – Hersha

+0

@Hersha Sì, stavo progettando di fare i negativi – Robbie

+0

MK, Milton Keynes manca dalla tua regex http://en.wikipedia.org/wiki/List_of_postcode_areas_in_the_United_Kingdom. FYI ad altre persone "GY" per Guernsey, "JE" per Jersey, e "IM" per Isola di Man sono incluse nella regex. Questo potrebbe andar bene, ma se sei solo in terraferma in Inghilterra dovrai rimuovere queste dipendenze da Crown. – Neil

risposta

4

ci sono 124 CAP commerciali nel Regno Unito.

- PAF® statistics August 2012, viaList of postcodes in the United Kingdom (Wikipedia).

mi consiglia di rompere il vostro problema in due parti (si pensi funzioni):

  1. è il codice postale valido?

    UK Postcode Regex (Comprehensive)

  2. È il codice postale inglese?

    Questo può essere suddiviso ulteriormente:

    • Non scozzese:
      • ! /^(ZE|KW|IV|HS|PH|AB|DD|PA|FK|G|KY|KA|DG|TD|EH|ML)[0-9]/
    • Non gallese:
      • ! /^(LL|SY|LD|HR|NP|CF|SA)[0-9]/
    • Non nordirlandese, Manx, dalle Isole del Canale, ...
      • eccetera ...
    • o si può solo controllare che la zona CAP è tra i cento o giù di lì quelli inglesi, a seconda di come si desidera ottimizzare ☻

si noti che la sintassi varierà in base al linguaggio di programmazione. Fare tutto questo in un'espressione regolare diventerebbe presto ingestibile.

+0

Quando l'ho visto per la prima volta, ho pensato che non fosse giusto, ma poi (penso) l'hai modificato e ha aggiunto [0-9] alla fine e questo ha cambiato tutto. Questo risolve il problema di associare i caratteri dall'input rimanente. Il tuo quarto punto sull'utilizzo solo dei codici postali in inglese è probabilmente la strada da percorrere (anche se inizialmente pensavo fosse il contrario). È una regex leggermente più lunga, ma mi evita di dovermi preoccupare di altri posti casuali come Gibilterra, Isole del Canale, ecc ... quindi, il merito per questo è il tuo :) – Robbie

+0

Eccellente. Felice di aiutare. – Johnsyweb

+0

penso che funzioni^(AL | B | B [ABDHLNRS] | C [ABHMORTVW] | D [AEHLNTY] | E | E [CNX] | FY | G [LUY] | H [ADGPUX] | I [GM P ] | JE | KT | L | L [AENSU] | M | ME | N | N [EGNRW] | O [LX] | P [ELOR] | R [GHM] | S | S [EGKLMNOPRSTW] | T [AFNQ RSW] | UB | W | W [ACDFNRSV] | YO) \ d {1,2} \ s (\ d [\ w] {2})?? – Robbie

1

Usa ^(AB|AL|B| ...)$, dove la ... è dove si compila il resto di quelli validi a, separati da tubi (|).

EDIT: C'è una barca di informazioni qui: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

Se si dovesse includere i codici in/out, sarebbe qualcosa di simile ^(AB|AL|B| ...)([\d\w]{3})\s([\d\w]{3})$, che otterrebbe il resto del codice.

EDIT

^(A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CNX]?|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|T[AFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE)([\w\d]{1,2})\s?([\w\d]{3})$

Parte di questa espressione regolare è preso da un altro una delle risposte. Corrisponde ai codici postali validi, quindi 1 a 2 {1,2} lettere \w o numeri \d, uno spazio opzionale \s?, quindi 3 lettere o numeri. Spero possa aiutare.

+0

Sì, questo è quello che pensavo inizialmente, ma non escluderà erroneamente i codici postali validi che contengono quei caratteri in altri posti. Ad esempio G è Glasgow, ma ci sono codici postali inglesi validi che contengono la lettera G - ad esempio GL – Robbie

+0

Questo è ciò che il^e $ sono per - lo costringe a far corrispondere l'intera stringa anziché solo una parte. –

+0

Ho provato a capovolgerlo e inserire i codici postali inglesi validi. Ho rimosso il^come voglio che corrisponda a loro e provato con diversi campioni. Sembrava così "(AL | B | BA | ...resto dei codici validi) $ "Non sembra funzionare, ad esempio HG2 8EH non corrisponde, ma dovrebbe - ho interpretato male come fare? – Robbie

0
'A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CNX]?|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|T[AFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE' 
+0

Ho provato questa regex e restituisce corrispondenze per alcuni codici postali non inglesi ... ad esempio G11 5EH (glasgow - la sua corrispondenza sulla 'E'). Qualsiasi cosa che contenga qualcuno dei singoli i codici di uscita della lettera nell'input sono abbinati a questa espressione regolare .... questo è lo stesso problema che ho menzionato sulla risposta di Derreck Dean – Robbie

3

Non è possibile elaborare una regex solo in Inghilterra, perché le aree del codice postale non si trovano lungo i confini politici, almeno non a livello di CAP o di distretto.

Ad esempio, CH1 è in Inghilterra e CH5 è in Galles.

A livello di distretto di codice postale ci sono ancora problemi, ad esempio TD12 è la metà in Inghilterra, metà in Scozia.

L'unica zona che si può contare su è BT (Irlanda del Nord)

+0

Hai ragione che non è possibile essere corretti al 100% a causa dei limiti, ma la soluzione che ho inserito nella modifica della domanda era sufficientemente accurata per i miei clienti. – Robbie

1

Questi sono i RegEx ho messo insieme che segue la Royal Mail ha definito gli standard per il Regno Unito tutti i tipi di codice postale:

standard Postcodes Regno Unito : codici postali

/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i 

Girobank:

/^(GIR)\s*(0AA)$/i 
Territori

UK Overseas:

/^([A-Z]{4})\s*(1ZZ)$/i 

britannica Forze Posta:

/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i 

E questa è la funzione che ho scritto che convalida un codice postale contro questi quattro tipi e consente di rilevare il tipo :

public function UKPostCode(&$strPostCode, &$strError = null, &$strType = null, $ReturnFormatted = true) { 
    $strStrippedPostCode = preg_replace("/[\s\-]/i", "", $strPostCode); 

    if (empty($strStrippedPostCode)) { 
     $strError = $this->__getErrorMessage("Post", "EMPTY_POST"); 
     return false; 

    } 

    $arrRegExp = array(
     "STD" => "/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i", 
     "GIR" => "/^(GIR)\s*(0AA)$/i", 
     "OST" => "/^([A-Z]{4})\s*(1ZZ)$/i", 
     "BFPO" => "/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i" 
    ); 

    foreach ($arrRegExp as $strPostCodeType => $strExpression) { 

     if (preg_match($strExpression, $strPostCode, $arrMatches)) { 

      if ($ReturnFormatted !== null) { 
       array_shift($arrMatches); 
       $strPostCode = implode(" ", array_filter($arrMatches)); 
       $strPostCode = ((bool)$ReturnFormatted === true) ? strtoupper($strPostCode) : strtolower($strPostCode); 

      } 

      $strType = $strPostCodeType; 
      return true; 

     } 

    } 

    $strError = $this->__getErrorMessage("Post", "INVALID_POST"); 
    return false; 

} 

Spero che questo aiuti

+0

Niente qui che risponda alla vera domanda riguardante l'Inghilterra solo i codici postali, ma utile come risorsa, quindi grazie per aver contribuito. Ti darò i tuoi primi 10 punti - benvenuto in SO :) – Robbie

7

Ho già risposto una volta, sottolineando che non è possibile ottenere una regex corretta solo al 100% corretta (poiché le aree del codice postale non si trovano lungo i confini politici).

Tuttavia ho scavato un po 'più a fondo in questo, e ... beh, è ​​possibile , ma è un sacco di lavoro.

Per verificare un codice postale solo in Inghilterra, è necessario escludere i codici postali non inglesi. I più facili sono:

  • BT (Irlanda del Nord)
  • IM (Isola di Man)
  • JE (Jersey)
  • GG (Guernsey)
  • BF (forze britanniche)
  • (i codici postali del Regno Unito non geografiche) BX
  • GIR (Girobank, che è anche non geografico)

(io non ho intenzione di parlare di codici postali in stile britannico per i territori al di fuori del Regno Unito come St Helena, Gibilterra ecc. Tecnicamente parlando, l'Isola di Man e le Channel Islands non fanno parte del Regno Unito, ma sono molto più vicine e più strettamente legate al sistema Royal Mail nel Regno Unito.)

Il CAP puramente scozzese aree sono (come lei ha ricordato):

ZE, KW, IV, HS, PH, AB, DD, PA, FK, G, KY, KA, EH, ML

DG e TD sono nominalmente scozzese, e sono per la maggior parte in Scozia. Tuttavia alcune aree si estendono oltre il confine Scozia-Inghilterra come segue:

  • DG16 - un pochino in Inghilterra
  • TD9 - un pochino in Inghilterra
  • TD12 - mezzo in Inghilterra
  • TD15 - per lo più in Inghilterra

La composizione è la seguente:

DG16 è in Scozia ad eccezione delle seguenti codici postali inglesi:

  • DG16 5H [TUZ]
  • DG16 5J [AB]

TD9 è in Scozia ad eccezione di TD9 0T [JPRSTUW]

TD12 ha un solo settore (TD12 4), che si sviluppa circa metà e metà in Inghilterra e Scozia:

  • TD12 4 [ABDEHJLN] sono in Scozia
  • TD12 4 [QRSTUWX] sono in Inghilterra

TD15 è il più complicato. Ci sono 3 settori, di cui TD15 2 e TD15 9 sono interamente in Inghilterra.

TD15 1 è suddiviso tra Inghilterra e Scozia.

Postcodes inizio nel modo seguente sono in Scozia:

  • TD15 1T
  • TD15 1X

...tranne che per questi codici postali inglesi:

  • TD15 1T [ABQUX]
  • TD15 1XX

Tutti gli altri codici di avviamento postale in TD15 1 sono in Inghilterra, ad eccezione di quelli che iniziano come segue:

  • TD15 1B
  • TD15 1S (ad es. TD15 1S [ABEJLNPWXY])
  • TD15 1U (cioè TD15 1U [BDENPQRTUXY])

... che sono tutti in Inghilterra, con l'eccezione dei seguenti codici di avviamento postale che si trovano in Scozia:

  • TD15 1BT
  • TD15 1S [UZ]
  • TD15 1U [FGHJLSZ]

Inglese zone postali CA e NE si trovano dall'altra parte del confine fra l'Inghilterra-Scozia, tuttavia essi non si estendono in Scozia.

In effetti, le ultime due lettere di un codice postale nel Regno Unito si basano su come il postino consegna effettivamente post (per quanto ne so), quindi non è dato per scontato che cadrà all'interno di un confine politico. Quindi, se c'è un gruppo di case che si trova a cavallo del confine, allora è possibile che l'intero codice postale (cioè al livello più fine) non si trovi interamente in Inghilterra o in Scozia. Per esempio. TD9 0TJ e TD15 1UZ sono molto vicini al confine e non so per certo se sono interamente su un lato o meno.

Il confine tra Inghilterra e Galles è anche complicato, tuttavia lascerò questo come esercizio per il lettore.

+0

Ciao jim. Quasi 4 anni e ho trovato questo davvero utile. Grazie mille per il tuo tempo e impegno qui. Domanda veloce - c'è un refuso in questa parte: 'TD12 4 [ABDEHJLN] sono in Scozia | TD12 4 [QRSTUWX] sono in Inghilterra'? – michaelmcgurk

Problemi correlati