我正在努力寻找验证欧洲VAT-ID的方法。它们的长度不同,有时会有校验和等等。 Normaly我正在使用正则表达式来验证简单的字符串 - 但这看起来对我来说非常复杂。
维基百科有一个不同语法的列表:
因此,在开始之前,浪费了大量时间并且最终失败了,我想知道比我更常使用正则表达式的人,如果有可能预先验证这些数字。如果您认为,正则表达式无法进行VAT-ID语法验证,请为我提供一个全面的示例。
提前谢谢。
注意: 当然,我知道德国财政部(https://evatr.bff-online.de/eVatR/xmlrpc/)的验证XML-RPC验证,但这需要几分钟才能收到请求的答案。同样,它们会在柏林时间23:00到05:00之间中断对此XML-RPC验证服务的操作。这就是我想要进行两步验证的原因:第一步是使用这个XML-RPC进行语法,第二步(由cron触发)。
答案 0 :(得分:24)
有一个正则表达式可以验证Regular Expressions Cookbook, 2nd edition, 4.21. European VAT Numbers section提供的27个欧盟国家/地区的增值税号。
此正则表达式没有计算检查,但它仍然可以检查可能是欧盟增值税号的独立字符串。
在验证之前,您应该删除[-.●]
或[^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}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
)$
请参阅regex demo
我在这里添加了克罗地亚增值税替代品。
请注意,如果您希望国家/地区代码存在,请在结束圆括号后删除?
量词。
当新国家加入欧盟或成员国更改增值税号的规则时,正则表达式需要更新。
请注意,食谱中的正则表达式与Wiki的爱尔兰增值税号定义不符。
此外,无法使用正则表达式对此进行全面验证,因为某些增值税号要求特定数据难以检索或应使用常规编程语言计算:
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,048
的税号是FR 83,404,833,048
来自:www.insee.fr 。答案 1 :(得分:1)
与数字(mod,乘法,加法)有关的计算不能表示为(实用的)RegExp,因为语言不规则。
由于数字的大小有限,理论上可以创建一个匹配所有正确数字的RegExp。但显然这不切实际。
有关实际计算的详细信息,请参阅http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml(德语)
答案 2 :(得分:1)
我的答案基于Wikipedia和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}))$
我发现一些爱尔兰VAT ID没有提到答案。它不是100%防弹(特别是对于GB政府部门),但应该做好工作。
答案 3 :(得分:0)
我最近做了一些事情。我所做的是保留一份国家列表,由他们的2个字符ISO代码标识。每个国家都有一个正则表达式字段,如果给定验证器将使用它来检查输入字符串是否与给定的正则表达式匹配。如果不是,那将是一个错误。
之后,我可以选择在特定国家/地区进行额外检查。但是更多配置为在后端运行或不运行的地方。没有'一般'的方法来做到这一点。
此外,每个国家/地区都有欧盟国旗或不知道是否需要进行其他检查。
我还使用了这个链接:https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s21.html以及维基百科的列表来获取ISO代码的完整列表。我还使用此作为测试增值税号码的参考:https://www.braemoor.co.uk/software/vattestx.php
答案 4 :(得分:0)
塞浦路斯更改为:
(CY)?[0-9]{8}[A-Z]
在VIES检查网站上还是错误的。