有没有人知道检查哪个公司跟踪号是包裹的给定跟踪号的好地方或模式。想法是在扫描条形码以获取带有图案的包裹检查跟踪号并显示它是由哪家公司运送的。
18 回答
只是想我会发布一个更新,因为我正在处理这个以通过 jquery 匹配并自动选择合适的运输公司。我为我的项目编制了一个匹配的正则表达式列表,并且我在 UPS FedEX 和 USPS 上测试了很多跟踪号码。
如果您遇到不匹配的内容,请在此处通过评论告诉我,我也会尝试解决此问题。
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/
联邦快递:(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$/
请注意,这些不是我自己想出来的。我只是四处搜索并从不同的来源编译了列表,包括这里可能提到的一些。
谢谢
编辑:修复了缺少的结束分隔符。
我向 Royal Mail 申请了 Recorded Delivery & Special Delivery 跟踪参考的正则表达式,但并没有走得太远。即使是一整套规则,以便我可以自己滚动,也超出了它们。
基本上,即使他们花了大约一周的时间回来并提供了表示服务类型的各种字母组合,我还是能够根据我们的经验提供示例,这些示例表明还有其他组合显然是有效的,但他们没有记录在案。
引用遵循我认为 Jefe 的/^[A-Za-z]{2}[0-9]+GB$/
正则表达式将描述的明显标准国际格式:
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
如果没有这些前缀之一,则服务是 Recorded Delivery,它提供交付确认但不跟踪。
通常,包含 S、X 或 Z 似乎表示更高的服务水平,我认为我从未见过在前缀中带有任何这些字母的正常记录交付项目。
但是,如您所见,如果要使用正则表达式检查服务级别,则需要测试许多前缀,并且鉴于皇家邮政似乎无法提供全面的规则集,那么尝试测试服务级别可能是徒劳的。
我需要验证 JUST 美国邮政服务 (USPS) 追踪号码。WikiAnswers 说我的数字格式如下:
USPS 仅提供快递邮件跟踪,通常以“E”开头,另一个字母,后跟 9 位数字,以及另外两个字母。对于长度在 16 到 22 位之间的其他服务,USPS 确实有“标签编号”。
http://wiki.answers.com/Q/How_many_numbers_in_a_USPS_tracking_number
我要补充一点,标签编号以“9”开头,因为过去 2 年我从个人发货中获得的所有标签编号都以 9 开头。
所以,假设 WikiAnswers 是正确的,这是我的正则表达式,它匹配两者:
/^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 的正则表达式测试器,这个模式匹配我的两个测试字符串:
快递邮件:EK225651436US
标签号:9410803699300003725216
**注意:如果您使用的是 ColdFusion(我是),请从模式中删除第一个和最后一个“/”
我的用例需要更强大的东西。我不断地遇到不完整、不正确或过于冗长的示例,而正确性没有任何改进。希望这对其他人有帮助!它涵盖了其他答案中的所有不同格式,再加上一些,并且与其他一些答案不同,FedEx 和 USPS 之间没有重叠。
追踪号码正则表达式:
美国邮政/S10:
\b([A-Z]{2}\d{9}[A-Z]{2}|(420\d{9}(9[2345])?)?\d{20}|(420\d{5})?(9[12345])?(\d{24}|\d{20})|82\d{8})\b
UPS:
\b1Z[A-Z0-9]{16}\b
联邦快递:
\b([0-9]{12}|100\d{31}|\d{15}|\d{18}|96\d{20}|96\d{32})\b
警告/注意事项:
- FedEx SmartPost [有意] 归类为 USPS;它可以被跟踪
- USPS 包括用于国际邮政的 S10 格式跟踪号
- 跟踪号有模块校验位;这些正则表达式不检查它们
- 这是通过阅读规格表、阅读其他答案、查看开源代码等发现的。它匹配了大约 6,000 个跟踪号码,我以 100% 的准确率运行它,但我不能确定它在所有情况下都是正确的。
- 这些假设您在应用正则表达式之前已删除所有空格
运单号示例
主要来自:
| Tracking Number | Kind | Tracking Carrier |
|------------------------------------|-------------------------------------|------------------|
| 03071790000523483741 | USPS 20 | USPS |
| 71123456789123456787 | USPS 20 | USPS |
| 4201002334249200190132607600833457 | USPS 34v2 | USPS |
| 4201028200009261290113185417468510 | USPS 34v2 | USPS |
| 420221539101026837331000039521 | USPS 91 | USPS |
| 71969010756003077385 | USPS 91 | USPS |
| 9505511069605048600624 | USPS 91 | USPS |
| 9101123456789000000013 | USPS 91 | USPS |
| 92748931507708513018050063 | USPS 91 | USPS |
| 9400111201080805483016 | USPS 91 | USPS |
| 9361289878700317633795 | USPS 91 | USPS |
| 9405803699300124287899 | USPS 91 | USPS |
| EK115095696SA | S10 | USPS |
| 1Z5R89390357567127 | UPS | UPS |
| 1Z879E930346834440 | UPS | UPS |
| 1Z410E7W0392751591 | UPS | UPS |
| 1Z8V92A70367203024 | UPS | UPS |
| 1ZXX3150YW44070023 | UPS | UPS |
| 986578788855 | FedEx Express (12) | FedEx |
| 477179081230 | FedEx Express (12) | FedEx |
| 799531274483 | FedEx Express (12) | FedEx |
| 790535312317 | FedEx Express (12) | FedEx |
| 974367662710 | FedEx Express (12) | FedEx |
| 1001921334250001000300779017972697 | FedEx Express (34) | FedEx |
| 1001921380360001000300639585804382 | FedEx Express (34) | FedEx |
| 1001901781990001000300617767839437 | FedEx Express (34) | FedEx |
| 1002297871540001000300790695517286 | FedEx Express (34) | FedEx |
| 61299998820821171811 | FedEx SmartPost | USPS |
| 9261292700768711948021 | FedEx SmartPost | USPS |
| 041441760228964 | FedEx Ground | FedEx |
| 568283610012000 | FedEx Ground | FedEx |
| 568283610012734 | FedEx Ground | FedEx |
| 000123450000000027 | FedEx Ground (SSCC-18) | FedEx |
| 9611020987654312345672 | FedEx Ground 96 (22) | FedEx |
| 9622001900000000000000776632517510 | FedEx Ground GSN | FedEx |
| 9622001560000000000000794808390594 | FedEx Ground GSN | FedEx |
| 9622001560001234567100794808390594 | FedEx Ground GSN | FedEx |
| 9632001560123456789900794808390594 | FedEx Ground GSN | FedEx |
| 9400100000000000000000 | USPS Tracking | USPS |
| 9205500000000000000000 | Priority Mail | USPS |
| 9407300000000000000000 | Certified Mail | USPS |
| 9303300000000000000000 | Collect On Delivery Hold For Pickup | USPS |
| 8200000000 | Global Express Guaranteed | USPS |
| EC000000000US | Priority Mail Express International | USPS |
| 9270100000000000000000 | Priority Mail Express | USPS |
| EA000000000US | Priority Mail Express | USPS |
| CP000000000US | Priority Mail International | USPS |
| 9208800000000000000000 | Registered Mail | USPS |
| 9202100000000000000000 | Signature Confirmation | USPS |
以下是美国主要运营商的一些示例编号:
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 代码)。是的,我放弃了,开始针对我可以使用的所有模式进行测试。不得不写第二个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:
/^(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
美国邮政:
/^(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
联邦快递:
/^(((96|98)\d{5}\s?\d{4}$|^(96|98)\d{2})\s?\d{4}\s?\d{4}(\s?\d{3})?)$/i
您可以尝试这些(不保证):
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
美国邮政:
\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
但请在使用前进行测试。我推荐RegexBuddy。
我正在使用 Angular2+ 应用程序,只是将一个组件放在一起来处理常见的美国跟踪号码。它使用标准的 JavaScript RegExp 测试它们,我从这里和这里的资源中汇总,并在带有跟踪链接 URL 的锚标记上设置 href(如果它是好的)。您不必使用 Angular 或 TypeScript 即可轻松地将其适应您的应用程序。我用不同的虚拟数字对其进行了测试,到目前为止似乎是动态工作的。请注意,您还可以在最后一个 else 语句中使用内联注释 url 切换 null,它会将您发送到 Google 搜索。
任何反馈(或者如果您的跟踪号码不起作用)请让我知道我会更新答案。谢谢!
HTML 中的用法:
<app-tracking-number [trackNum]="myTrackingNumberInput"></app-tracking-number>
组件.TS
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-tracking-number',
templateUrl: './tracking-number.component.html',
styleUrls: ['./tracking-number.component.scss']
})
export class TrackingNumberComponent implements OnInit {
@Input() trackNum:string;
trackNumHref:string = null;
// Carrier tracking numbers patterns from https://www.iship.com/trackit/info.aspx?info=24 AND https://www.canadapost.ca/web/en/kb/details.page?article=how_to_track_a_packa&cattype=kb&cat=receiving&subcat=tracking
isUPS:RegExp = new RegExp('^1Z[A-H,J-N,P,R-Z,0-9]{16}$'); // UPS tracking numbers usually begin with "1Z", contain 18 characters, and do not contain the letters "O", "I", or "Q".
isFedEx:RegExp = new RegExp('^[0-9]{12}$|^[0-9]{15}$'); // FedEx Express tracking numbers are normally 12 digits long and do not contain letters AND FedEx Ground tracking numbers are normally 15 digits long and do not contain letters.
isUSPS:RegExp = new RegExp('^[0-9]{20,22}$|^[A-Z]{2}[0-9,A-Z]{9}US$'); // USPS Tracking numbers are normally 20-22 digits long and do not contain letters AND USPS Express Mail tracking numbers are normally 13 characters long, begin with two letters, and end with "US".
isDHL:RegExp = new RegExp('^[0-9]{10,11}$'); // DHL tracking numbers are normally 10 or 11 digits long and do not contain letters.
isCAPost:RegExp = new RegExp('^[0-9]{16}$|^[A-Z]{2}[0-9]{9}[A-Z]{2}$'); // 16 numeric digits (0000 0000 0000 0000) AND 13 numeric and alphabetic characters (AA 000 000 000 AA).
constructor() { }
ngOnInit() {
this.setHref();
}
setHref() {
if(!this.trackNum) this.trackNumHref = null;
else if(this.isUPS.test(this.trackNum)) this.trackNumHref = `https://wwwapps.ups.com/WebTracking/processInputRequest?AgreeToTermsAndConditions=yes&loc=en_US&tracknum=${this.trackNum}&Requester=trkinppg`;
else if(this.isFedEx.test(this.trackNum)) this.trackNumHref = `https://www.fedex.com/apps/fedextrack/index.html?tracknumber=${this.trackNum}`;
else if(this.isUSPS.test(this.trackNum)) this.trackNumHref = `https://tools.usps.com/go/TrackConfirmAction?tLabels=${this.trackNum}`;
else if(this.isDHL.test(this.trackNum)) this.trackNumHref = `http://www.dhl.com/en/express/tracking.html?AWB=${this.trackNum}&brand=DHL`;
else if(this.isCAPost.test(this.trackNum)) this.trackNumHref =`https://www.canadapost.ca/trackweb/en#/search?searchFor=${this.trackNum}`;
else this.trackNumHref = null; // Google search as fallback... `https://www.google.com/search?q=${this.trackNum}`;
}
}
组件 .HTML
<a *ngIf="trackNumHref" [href]="trackNumHref" target="_blank">{{trackNum}}</a>
<span *ngIf="!trackNumHref">{{trackNum}}</span>
我在我编写的 eBay 应用程序中使用这些:
美国邮政国内:
/^91[0-9]+$/
美国邮政国际:
/^[A-Za-z]{2}[0-9]+US$/
联邦快递:
/^[0-9]{15}$/
但是,这可能是 eBay/Paypal 特定的,因为所有 USPS 国内标签都以“91”开头。所有 USPS International 标签均以两个字符开头并以“US”结尾。据我所知,联邦快递只使用 15 个随机数字。
(请注意,这些正则表达式假定所有空格都已删除。但允许空格相当容易)
查看这个 github 项目,其中列出了许多 PHP 跟踪正则表达式。 https://github.com/darkain/php-tracking-urls
这是我现在在我的 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);
这是一个很好的资源,它涵盖了几乎所有的可能性,并且和我发现的一样紧凑:
https://andrewkurochkin.com/blog/code-for-recognizing-delivery-company-by-track
string[] upsPattern = new string[]
{
"^(1Z)[0-9A-Z]{16}$",
"^(T)+[0-9A-Z]{10}$",
"^[0-9]{9}$",
"^[0-9]{26}$"
};
string[] uspsPattern = new string[]
{
"^(94|93|92|94|95)[0-9]{20}$",
"^(94|93|92|94|95)[0-9]{22}$",
"^(70|14|23|03)[0-9]{14}$",
"^(M0|82)[0-9]{8}$",
"^([A-Z]{2})[0-9]{9}([A-Z]{2})$"
};
string[] fedexPattern = new string[]
{
"^[0-9]{20}$",
"^[0-9]{15}$",
"^[0-9]{12}$",
"^[0-9]{22}$"
};
我相信联邦快递是 12 位数字:
^[0-9]{12}$
我最近还发现了 FedEx 的 22 位跟踪号码,所以要小心!对于 FedEx 的一般格式,我还没有找到任何好的参考资料。
联邦快递示例 #:9612019059803563050071
这是 UPS 的最新正则表达式。它适用于标准和 Mail Innovation 类型的跟踪号码:
\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|\d\d\d ?\d\d\d ?\d\d\d|\d{22,34})\b
//UPS - 联合包裹服务最终字符串 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]|T\d{3} ?\d{4} ?\d{3})\ b";
//USPS - 美国邮政服务 - 格式 1 final String USPS_FORMAT1 = "\b((420 ?\d{5} ?)?(91|92|93|94|01|03|04|70|23|13 )\d{2} ?\d{4} ?\d{4} ?\d{4} ?\d{4}( ?\d{2,6})?)\b";
//USPS - 美国邮政服务 - 格式 2 最终字符串 USPS_FORMAT2 = "\b((M|P[AZ]?|D[CZ]|LK|E[AC]|V[AZ]|R[AZ]| CP|CJ|LC|LJ) ?\d{3} ?\d{3} ?\d{3} ?[AZ]?[AZ]?)\b";
//USPS - 美国邮政服务 - FORMAT 3 final String USPS_FORMAT3 = "\b(82 ?\d{3} ?\d{3} ?\d{2})\b";
//FEDEX - 联邦快递最终字符串 FED_EX = "\b(((96\d\d|6\d)\d{3} ?\d{4}|96\d{2}|\d{4} ) ?\d{4} ?\d{4}( ?\d{3})?)\b";
//ONTRAC 最终字符串 ONTRAC = "\b(C\d{14})\b";
//DHL final String DHL = "\b(\d{4}[-]?\d{4}[-]?\d{2}|\d{3}[-]?\d{8}| [AZ{3}\d{7})\b";
Sample tracking number
UPS
//"1Z 999 AA1 01 2345 6784"
Fed-ex
// "449044304137821"
USPS
//"9400 1000 0000 0000 0000 00"
final Pattern pattern = Pattern.compile(DHL, Pattern.CASE_INSENSITIVE |
Pattern.UNICODE_CASE);
final Matcher matcher = pattern.matcher("1Z 999 AA1 01 2345 6784");
if (matcher.find()) {
System.out.println(true + "");
}
它在java和android中工作。 https://regex101.com/ 您可以通过此链接将您的正则表达式更改为另一种语言的正则表达式并生成代码。
我知道已经有很多答案,而且很久以前就有人问过这个问题,但我没有看到一个可以用一个表达式解决所有可能的 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
然而,迟到的聚会,下面的内容也适用于 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