2015-11-10 2 views
5

私は欧州のVAT-IDを検証する方法を探しています。長さが異なり、チェックサムなどがあることがあります。ノーマル私は単純な文字列を検証するために正規表現を使用していますが、これは私にとって非常に複雑なものです。Regexで文法上の正確さのためにVAT番号を確認できますか?

ウィキペディアは異なる構文のリストがありますので、開始時間の多くを無駄にしてで失敗する前に

を最後に、これらの数値を事前に検証することができるのであれば、私よりも頻繁に正規表現を使用する人から知りたいと思います。あなたが考えるならば、VAT-ID構文の検証は正規表現では不可能です。包括的な例を教えてください。

ありがとうございます。

注:当然私はドイツの財務省(https://evatr.bff-online.de/eVatR/xmlrpc/)の検証XML-RPC検証について知っていますが、これはリクエストの回答を受け取るのに数分かかる場合があります。同様に、彼らはこのXML-RPC検証サービスの動作をベルリン時間の23:00から05:00まで中断します。そういうわけで、私は2段階の検証をしたいと思っています。このXML-RPCを使って構文、第2段階(cronによってトリガー)の第1段階です。

+1

どの国のVATに興味がありますか?すべて、EUのみ、または特定の国? [Safaribooksonline](https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s21.html)リソースを確認してください。 –

+0

EUのVAT番号。 –

答えて

1

数値(mod、multiplication、additions)に関する計算は、言語が規則的でないため、(実際的な)RegExpとして表すことはできません。

数字が有限であるため、理論的にはすべての正しい数字に一致するRegExpを作成することができます。しかし、これは明らかに実用的ではありません。実際の計算の詳細については

http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml(ドイツ語)を参照してください

+0

Downvote?いい加減にして。参照された本(少なくとも)から自由にコピーされた "解決策"の上で、チェックサムを確認することはありません。それは興味深い部分です。 – mgaert

+0

数字は有限であるため、言語*は* regularです。しかし、正規表現は実際にはまだ実用的ではありません。 – hvd

13

Regular Expressions Cookbook, 2nd edition, 4.21. European VAT Numbers sectionに設けた27のEU加盟国のVAT番号を検証する正規表現があります。

この正規表現ではコンピューティングチェックはありませんが、引き続きEU VAT番号である可能性のあるスタンドアロン文字列をチェックすることができます。

検証の前に、[-.●]または[^A-Z0-9]の記号を削除する必要があります。その後、regex demo

を参照してください

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

を使用し、私はここにクロアチアの付加価値税の代替を追加しました。

国コードが存在することが予想される場合は、閉じ括弧の後に?個の制限記号を削除してください。

新しい国がEUに加わるか、加盟国が付加価値税番号の規則を変更するたびに、正規表現には更新が必要です。

料理本の正規表現は、WikiのアイルランドのVAT番号定義に対応していないことに注意してください。

また、それはいくつかのVAT番号はどちらかのハード取得する場合や、通常のプログラミング言語を使用して計算する必要がある特定のデータを必要とするため、完全に正規表現でこれを検証することはできません意味:

  • フランスの最初の2桁フランス語のキーは、Key = [ 12 + 3 * (SIREN modulo 97) ] modulo 97のように計算されます。のように、404,833,048の税番号はFR 83,404,833,048です。ソースはwww.insee.frです。
  • フィンランドVAT最後の桁は、MOD 11-2を利用してチェックデジットである
  • イタリアのVATは11
によって
  • スロバキアVAT番号は割り切れなければならない州3シンボルコード(インデックス8、9、10)を有しています
  • +0

    さて、私は参照してください。それを検証するのは難しいし、何かニュースソースを見つけられず、笑顔が変わったときにVATのニュースを公開するだけだった。私はこれを私のRSSに入れて、変更があった場合には気をつけていただろう...しかし、実際には、私は、各国の別々のVATクラスで検証機能を構築し、必要に応じて、すべての鍵とすべての権利を得る。 Regexフィルタは最初のステップであり、2番目のステップではチェックサムとキーを計算します... –

    +0

    これは少なくとも、これは少なくとも少し役立つことを願っています。 –

    +0

    私はこのコードを公開して誰かが変更の際にそれにコミットすることができるようにオープンソースにします。 –

    0

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

    私はいくつかのアイルランドのVAT IDは上記の答えで作業していなかったことがわかりました。 100%防弾ではありませんが(特にGB政府機関の場合)、作業を行う必要があります。

    関連する問題