2015-11-10 41 views
5

Sto cercando di trovare un modo per convalidare gli ID IVA europei. Essi variano in lunghezza, a volte hanno il checksum e così via. Normalmente sto usando regex per convalidare stringhe semplici - ma questo mi sembra molto complesso.Controllare la partita IVA per correttezza sintattica con Regex possibile?

Wikipedia ha una lista delle diverse sintassi:

Quindi, prima di iniziare, sprecando un sacco di tempo e non riuscendo a Alla fine, mi piacerebbe sapere da qualcuno che usa regex più spesso di me, se sarà possibile pre-validare questi numeri. Se pensi che la convalida della sintassi VAT-ID non sia possibile per le regex, ti prego di fornirmi un esempio esauriente perché no.

Grazie in anticipo.

Note: Naturalmente conosco la convalida di convalida XML-RPC del ministero delle finanze tedesco (https://evatr.bff-online.de/eVatR/xmlrpc/), ma questo richiede talvolta diversi minuti per ricevere una risposta per la richiesta. Inoltre, interrompono l'operazione su questo servizio di convalida XML-RPC dalle 23:00 alle 05:00 all'ora di Berlino. Questo è il motivo per cui mi piacerebbe avere una convalida in 2 fasi: primo passo per la sintassi, secondo passo (attivato da cron) con questo XML-RPC.

+1

Quale paese ti interessa? Tutti, solo UE, o paesi specifici? Per favore controlla la risorsa [Safaribooksonline] (https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s21.html). –

+0

Numeri IVA UE. –

risposta

1

I calcoli relativi al numero (mod, moltiplicazione, aggiunte) non possono essere rappresentati come RegExp (praticabile), poiché la lingua non è regolare.

Poiché i numeri sono di dimensioni limitate, in teoria è possibile creare un RegExp che corrisponda a tutti i numeri corretti. Ma questo non è pratico, ovviamente.

Per i dettagli sul calcolo effettivo, vedere http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml (tedesco)

+0

Downvote? Dai. Sopra la "soluzione", liberamente copiata dal libro di riferimento (almeno), non _non_ verifica la somma di controllo, e questa è la parte interessante. – mgaert

+0

Poiché i numeri sono di dimensioni finite, la lingua * è * regolare. Ma una regex non è davvero ancora pratica. – hvd

13

C'è una regex per convalidare il numero di partita IVA dei 27 paesi dell'Unione europea forniti al Regular Expressions Cookbook, 2nd edition, 4.21. European VAT Numbers section.

Non vi è alcun controllo informatico con questa espressione regolare, ma sarà comunque in grado di verificare le stringhe indipendenti che potrebbero essere numeri di partita IVA UE.

Prima della convalida, è necessario rimuovere i simboli [-.●] o [^A-Z0-9]. Poi, utilizzare

(?xi)^(
(AT)?U[0-9]{8} |        # Austria 
(BE)?0[0-9]{9} |        # Belgium 
(BG)?[0-9]{9,10} |       # Bulgaria 
(HR)?[0-9]{11} |        # Croatia 
(CY)?[0-9]{8}L |        # Cyprus 
(CZ)?[0-9]{8,10} |       # Czech Republic 
(DE)?[0-9]{9} |        # Germany 
(DK)?[0-9]{8} |        # Denmark 
(EE)?[0-9]{9} |        # Estonia 
(EL)?[0-9]{9} |        # Greece 
ES[A-Z][0-9]{7}(?:[0-9]|[A-Z]) |    # Spain 
(FI)?[0-9]{8} |        # Finland 
(FR)?[0-9A-Z]{2}[0-9]{9} |     # France 
(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3}) | # United Kingdom 
(HU)?[0-9]{8} |        # Hungary 
(IE)?[0-9]{7}[A-Z]{1,2} |     # Ireland 
(IE)?[0-9][A-Z][0-9]{5}[A-Z] |    # Ireland (2) 
(IT)?[0-9]{11} |        # Italy 
(LT)?([0-9]{9}|[0-9]{12}) |     # Lithuania 
(LU)?[0-9]{8} |        # Luxembourg 
(LV)?[0-9]{11} |        # Latvia 
(MT)?[0-9]{8} |        # Malta 
(NL)?[0-9]{9}B[0-9]{2} |      # Netherlands 
(PL)?[0-9]{10} |        # Poland 
(PT)?[0-9]{9} |        # Portugal 
(RO)?[0-9]{2,10} |       # Romania 
(SE)?[0-9]{12} |        # Sweden 
(SI)?[0-9]{8} |        # Slovenia 
(SK)?[0-9]{10}        # Slovakia 
)$ 

Vedi l'regex demo

Ho aggiunto un croato alternativa IVA qui.

Si noti che se si prevede che i codici paese siano presenti, rimuovere i quantificatori ? dopo le parentesi tonde di chiusura.

Ogni volta che nuovi paesi aderiscono all'Unione europea, o i paesi membri cambiano le loro regole per i numeri di partita IVA, la regex ha bisogno di un aggiornamento.

Si noti che la regex nel ricettario non corrisponde alla definizione del numero di partita IVA irlandese del Wiki.

Inoltre, non è possibile convalidare pienamente questo con l'espressione regolare perché alcune partite IVA richiedono dati specifici che è o difficili da recuperare o dovrebbe essere calcolato utilizzando normale linguaggio di programmazione significa:

  • francesi prime 2 cifre sono una "chiave" e la chiave francese è calcolata come segue: Key = [ 12 + 3 * (SIREN modulo 97) ] modulo 97, ad esempio: Key = [ 12 + 3 * (404,833,048 modulo 97) ] modulo 97 = [12 + 3*56] modulo 97 = 180 modulo 97 = 83 quindi il codice fiscale per 404,833,048 è FR 83,404,833,048 fonte: www.insee.fr.
  • IVA finlandese ultima cifra è una cifra di controllo che utilizza MOD 11-2
  • IVA italiana ha una provincia codice a 3-simbolo (indici 8, 9, 10)
  • numero di partita IVA slovacco deve essere divisibile per 11
+0

Beh, vedo. È difficile convalidarli e non ho trovato alcuna fonte di notizie, pubblicando solo un notiziario IVA quando la smething è cambiata. Avrei messo questo al mio RSS e sarei rimasto in allarme in caso di cambiamento ... Ma a livello verticale, penso che costruirò una funzione di convalida in una classe IVA separata per ogni paese in modo da poter inserire il codice personalizzato all'interno del necessario per avere tutte le chiavi e tutto a posto. Il filtro Regex è solo il primo passo, in una seconda fase calcolerò checksum e chiavi ... –

+0

In ogni caso, spero che questo sia almeno un po 'utile. –

+0

Forse pubblicherò questo codice rendendolo opensource in modo che chiunque possa impegnarsi in caso di modifiche. –

0

La mia risposta sulla base di Wikipedia e Wiktor Stribiżew:

^(ATU[0-9]{8}|BE[01][0-9]{9}|BG[0-9]{9,10}|HR[0-9]{11}|CY[A-Z0-9]{9}|CZ[0-9]{8,10}|DK[0-9]{8}|EE[0-9]{9}|FI[0-9]{8}|FR[0-9A-Z]{2}[0-9]{9}|DE[0-9]{9}|EL[0-9]{9}|HU[0-9]{8}|IE([0-9]{7}[A-Z]{1,2}|[0-9][A-Z][0-9]{5}[A-Z])|IT[0-9]{11}|LV[0-9]{11}|LT([0-9]{9}|[0-9]{12})|LU[0-9]{8}|MT[0-9]{8}|NL[0-9]{9}B[0-9]{2}|PL[0-9]{10}|PT[0-9]{9}|RO[0-9]{2,10}|SK[0-9]{10}|SI[0-9]{8}|ES[A-Z]([0-9]{8}|[0-9]{7}[A-Z])|SE[0-9]{12}|GB([0-9]{9}|[0-9]{12}|GD[0-4][0-9]{2}|HA[5-9][0-9]{2}))$ 

ho scoperto che alcuni l'Irlanda P. IVA non funzionava con la risposta menzionato. Non è al 100% a prova di proiettile (soprattutto per i dipartimenti governativi della GB), ma dovrebbe fare il lavoro.

Problemi correlati