可以使用正则表达式检查增值税号码的语法正确性吗?

And*_*tte 11 regex validation

我正试图找到一种方法来验证欧洲VAT-ID.它们的长度不同,有时会有校验和等等.Normaly我正在使用正则表达式来验证简单的字符串 - 但这看起来对我来说非常复杂.

维基百科有一个不同语法的列表:

因此,在开始之前,浪费了大量时间并最终失败,我想知道比我更常使用正则表达式的人,如果有可能预先验证这些数字.如果您认为,正则表达式无法进行VAT-ID语法验证,请为我提供一个全面的示例.

先感谢您.

注意:当然我知道德国财政部的验证XML-RPC验证(https://evatr.bff-online.de/eVatR/xmlrpc/),但有时需要几分钟才能收到请求的答案.同样,它们会在柏林时间23:00到05:00之间中断对此XML-RPC验证服务的操作.这就是我想要进行两步验证的原因:第一步是语法,第二步(由cron触发)使用这个XML-RPC.

Wik*_*żew 27

有一个正则表达式来验证在提供的27个欧盟国家的增值税号码正则表达式食谱,第二版,4.21.欧洲增值税号码部分.

这个正则表达式没有计算检查,但它仍然能够检查可能是欧盟增值税号码的独立字符串.

在验证之前,您应该删除[-.?][^A-Z0-9]符号.然后,使用

(?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}[A-Z] |                          # 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
)$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

我在这里添加了克罗地亚增值税替代品.

请注意,如果您希望存在国家/地区代码,请?在结束圆括号后删除量词.

当新国家加入欧盟或成员国更改增值税号的规则时,正则表达式需要更新.

请注意,食谱中的正则表达式与Wiki的爱尔兰增值税号定义不符.

此外,无法使用正则表达式对此进行完全验证,因为某些增值税号要求特定数据难以检索或应使用常规编程语言计算:

  • 法国第一2位是一个"密钥",和法国密钥被计算为如下:Key = [ 12 + 3 * ( SIREN modulo 97 ) ] modulo 97,例如:Key = [ 12 + 3 * ( 404,833,048 modulo 97 ) ] modulo 97 = [12 + 3*56] modulo 97 = 180 modulo 97 = 83因此对于税收号码404,833,048FR 83,404,833,048从源:www.insee.fr.
  • 芬兰增值税最后一位是使用MOD 11-2的校验位
  • 意大利增值税有3个符号的代码(索引8,9,10)
  • 斯洛伐克的增值税号码必须可以被11整除


mar*_*rix 6

我的答案基于维基百科Wiktor Stribi\xc5\xbcew

\n\n
^(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}))$\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现一些爱尔兰增值税 ID 不适用于上述答案。它不是 100% 防弹(特别是对于英国政府部门),但应该可以完成工作。

\n


mga*_*ert 2

与数字相关的计算(模、乘法、加法)不能表示为(实用的)正则表达式,因为该语言不是正则的。

由于数字的大小是有限的,理论上可以创建一个匹配所有正确数字的正则表达式。但这显然是不切实际的。

有关实际计算的详细信息,请参见http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml(德语)