跟踪数字的正则expression式模式

有没有人知道哪个公司跟踪号码是一个包裹的给定跟踪号码的好地方或模式。 想法是扫描一个条形码包装检查跟踪号码与模式,并显示它是哪家公司运送。

只是以为我会发布更新,因为我正在通过jquery进行匹配,并自动select适当的运输公司。 我为我的项目编制了一个匹配的正则expression式列表,并且我已经在UPS FedEX和USPS上testing了很多追踪编号。

如果你遇到不匹配的东西,请通过评论让我知道,我也会试着想出来。

UPS:

/\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b/ 

FedEX:(3个不同的)

 /(\b96\d{20}\b)|(\b\d{15}\b)|(\b\d{12}\b)/ /\b((98\d\d\d\d\d?\d\d\d\d|98\d\d) ?\d\d\d\d ?\d\d\d\d( ?\d\d\d)?)\b/ /^[0-9]{15}$/ 

USPS:(4个不同的)

 /(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)/ /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/ /^91[0-9]+$/ /^[A-Za-z]{2}[0-9]+US$/ 

请注意,我没有拿出这些。 我只是四处search,并从不同的来源,包括可能已经在这里提到的一些编译列表。

谢谢

编辑:修复缺less结束分隔符。

我按了皇家邮政的logging交货和特殊交货跟踪参考正则expression式,但并没有太多。 即使有一套完整的规则,所以我可以推出自己的规则超出了他们。

基本上,即使他们花了大约一个星期的时间,然后用各种字母组合来表示服务types,我可以从我们的经验中得到一些例子,表明有额外的组合显然是有效的,但他们没有logging。

这些参考文献遵循显然是标准的国际格式,我认为Jefe的/^[A-Za-z]{2}[0-9]+GB$/ regex会描述:

XX123456789GB

即使这似乎是一个标准的格式,即大多数国际邮件有相同的格式,最后两个字母表示的原产国,我还没有能够找出更多关于这个“标准”或它源于(任何澄清的欢迎!)。

皇家邮件特别是似乎是用前两个字母来表示服务级别。 我已经设法编译了一个表示特殊传递的前缀列表,但我不相信它是100%完整的:

 AD AE AF AJ AK AR AZ BP CX DS EP HC HP KC KG KH KI KJ KQ KU KV KW KY KZ PW SA SC SG SH SI SJ SL SP SQ SU SW SY SZ TX WA WH XQ WZ 

没有这些前缀之一,服务是logging的交付,它提供了交货确认,但没有跟踪。

一般来说,包含S,X或Z代表更高的服务等级,而且我不认为我曾经看过正常的logging传送项目和前缀中的任何字母。

然而,正如你所看到的,如果使用正则expression式来检查服务级别,还有很多前缀需要testing,而且鉴于皇家邮件似乎不能提供全面的规则集,那么试图testing服务级别可能是徒劳的。

我需要validationJUST美国邮政服务(USPS)跟踪号码。 WikiAnswers说,我的数字格式如下:

美国邮政只提供跟踪快递邮件,通常以“E”开头,另一个字母,后面跟9个数字,还有两个字母。 美国邮政确实有其他服务的“标签号”,长度在16到22位之间。

http://wiki.answers.com/Q/How_many_numbers_in_a_USPS_tracking_number

我join的标签数字是以“9”开始的,因为我过去两年的个人出货量都是从9开始的。

所以,假设WikiAnswers是正确的,这是我的正则expression式匹配两个:

 /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/ 

这很简单。 这是分解:

 ^E - Begins w/ E (For express number) \D{1} - followed by another letter \d{9} - followed by 9 numbers \D{2} - followed by 2 more letters $ - End of string | - OR ^9 - Basic Track & Ship Number \d{15,21} - followed by 15 to 21 numbers $ - End of string 

使用www.gummydev.com的正则expression式testing器,这个模式匹配我的两个testingstring:

快递邮件:EK225651436US

标签号码:9410803699300003725216

**注意:如果您使用的是ColdFusion(我),请从模式中删除第一个和最后一个“/”

如果它帮助其他人寻找这个,下面是一个简单的Python类来解决常见的格式: Gist#541851

一直在研究这一点,并在这里主要根据这些答案作出这些。
这些应该涵盖一切,而不是太宽大。
UPS:
/^(1Z\s?[0-9A-Z]{3}\s?[0-9A-Z]{3}\s?[0-9A-Z]{2}\s?[0-9A-Z]{4}\s?[0-9A-Z]{3}\s?[0-9A-Z]$|[\dT]\d{3}\s?\d{4}s?\d{3})$/i

USPS:
/^(EA|EC|CP|RA)\d{9}(\D{2})?$|^(7\d|03|23|91)\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}(\s\d{2})?$|^82\s?\d{3}\s?\d{3}\s?\d{2}$/i

FEDEX:
/^(((96|98)\d{5}\s?\d{4}$|^(96|98)\d{2})\s?\d{4}\s?\d{4}(\s?\d{3})?)$/i

以下是美国主要航空公司的一些样本编号:

 USPS: 70160910000108310009 (certified) 23153630000057728970 (signature confirmation) RE360192014US (registered mail) EL595811950US (priority express) 9374889692090270407075 (regular) FEDEX: 810132562702 (all seem to follow same pattern regardless) 795223646324 785037759224 UPS: K2479825491 (UPS ground) J4603636537 (UPS next day express) 1Z87585E4391018698 (regular) 

我正在使用的模式(PHP代码)。 是的,我放弃了,开始testing所有的模式在我的处置。 不得不写第二台UPS。

 public function getCarrier($trackingNumber){ $matchUPS1 = '/\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b/'; $matchUPS2 = '/^[kKJj]{1}[0-9]{10}$/'; $matchUSPS0 = '/(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)/'; $matchUSPS1 = '/(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)|(\b\d{26}\b)| ^E\D{1}\d{9}\D{2}$|^9\d{15,21}$| ^91[0-9]+$| ^[A-Za-z]{2}[0-9]+US$/i'; $matchUSPS2 = '/^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/'; $matchUSPS3 = '/^91[0-9]+$/'; $matchUSPS4 = '/^[A-Za-z]{2}[0-9]+US$/'; $matchUSPS5 = '/(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)|(\b\d{26}\b)| ^E\D{1}\d{9}\D{2}$|^9\d{15,21}$| ^91[0-9]+$| ^[A-Za-z]{2}[0-9]+US$/i'; $matchFedex1 = '/(\b96\d{20}\b)|(\b\d{15}\b)|(\b\d{12}\b)/'; $matchFedex2 = '/\b((98\d\d\d\d\d?\d\d\d\d|98\d\d) ?\d\d\d\d ?\d\d\d\d( ?\d\d\d)?)\b/'; $matchFedex3 = '/^[0-9]{15}$/'; if(preg_match($matchUPS1, $trackingNumber) || preg_match($matchUPS2, $trackingNumber)) { echo('UPS'); $carrier = 'UPS'; return $carrier; } else if(preg_match($matchUSPS0, $trackingNumber) || preg_match($matchUSPS1, $trackingNumber) || preg_match($matchUSPS2, $trackingNumber) || preg_match($matchUSPS3, $trackingNumber) || preg_match($matchUSPS4, $trackingNumber) || preg_match($matchUSPS5, $trackingNumber)) { $carrier = 'USPS'; return $carrier; } else if (preg_match($matchFedex1, $trackingNumber) || preg_match($matchFedex2, $trackingNumber) || preg_match($matchFedex3, $trackingNumber)) { $carrier = 'FedEx'; return $carrier; } else if (0){ $carrier = 'DHL'; return $carrier; } return; } 

你可以试试这些(不保证):

UPS:

 \b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b 

UPS:

 \b(1Z ?\d\d\d ?\d\w\w ?\d\d ?\d\d\d\d ?\d\d\d ?\d|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b 

USPost:

 \b(\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d|\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d)\b 

但是在使用之前请先testing一下。 我推荐RegexBuddy 。

看看这个列出了很多PHP跟踪正则expression式的github项目。 https://github.com/darkain/php-tracking-urls

我在一个eBay应用程序中使用了这些:

USPS国内:

 /^91[0-9]+$/ 

USPS国际:

 /^[A-Za-z]{2}[0-9]+US$/ 

联邦快递:

 /^[0-9]{15}$/ 

但是,这可能是eBay / PayPal特定的,因为所有USPS Domestic标签都以“91”开头。 所有USPS国际标签都以两个字符开始,以“US”结尾。 据我所知,联邦快递只使用了15个随机数字。

(请注意,这些正则expression式假设所有的空格都被删除了,虽然允许空格也是相当容易的)

我相信联邦快递是12位数字:

 ^[0-9]{12}$ 

我最近也遇到了来自联邦快递22位数字的追踪号码,所以请注意! 联邦快递的一般格式我还没有find任何好的参考。

联邦快递示例#:9612019059803563050071

这里有一个最新的UPS正则expression式(与定期和邮件创新型跟踪号码一起工作):

(0-9A-Z){3}?[0-9A-Z] {3}?[0-9A-Z] {2}?[0-9A-Z] {4}?[ 0-9A-Z] {3}?[0-9A-Z] | [\ dT] \ d \ d \ d?\ d \ d \ d \ d?\ d \ d \ d | \ d \ d \ d?\ d \ d \ d?\ d \ d \ d | \ d {22,34})\ b

这里是我现在在我的Java应用程序中使用的。 这些取决于我从整批货运服务中吸取运送确认电子邮件中的跟踪号码的经验。 我只是从头开始制作一个新的USPS,因为我发现没有一个是根据USPS网站上的示例编号工作的。 这些仅适用于美国追踪代码,因为我们只在美国销售。

 private final Pattern UPS_TRACKING_NUMBER = Pattern.compile("[^A-Za-z0-9](1Z[A-Za-z0-9]{6,})", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); private final Pattern FEDEX_TRACKING_NUMBER = Pattern.compile("\\b((96|98)\\d{18,20}|\\d{15}|\\d{12})\\b", Pattern.MULTILINE); private final Pattern USPS_TRACKING_NUMBER = Pattern.compile("\\b(9[2-4]\\d{20}(?:(?:EA|RA)\\d{9}US)?|(?:03|23|14|70)\\d{18})\\b", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 

但是,在晚会之后,下面还会有26个字符的USPS号码。

 /(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)|(\b\d{26}\b)|^E\D{1}\d{9}\D{2}$|^9\d{15,21}$|^91[0-9]+$|^[A-Za-z]{2}[0-9]+US$/i 

我知道已经有很多答案了,很久以前就有人问到这个问题,但是我没有看到一个能够用单一expression方式解决所有可能的USPS跟踪号码的问题。

这是我想出来的:

 ((\d{4})(\s?\d{4}){4}\s?\d{2})|((\d{2})(\s?\d{3}){2}\s?\d{2})|((\D{2})(\s?\d{3}){3}\s?\D{2}) 

看到它在这里工作: http : //regexr.com/3e61u