跟踪号码的正则表达式模式

70

有没有人知道一个好的地方或模式,可以检查给定包裹的跟踪号码是哪个公司的。想法是在扫描包裹条形码后,通过模式检查跟踪号码并显示其所属的船运公司。


3
我看到很多人发布了一些图案,请记住,快递服务为不同国家的国内运输和本地服务使用不同的运单号/跟踪号格式。因此请谨慎参考。 - cwj
如果您正在寻找有关所有邮件和包裹中使用的国际标准代码的更多信息,那么您可能应该参考治理机构“万国邮政联盟”,它是联合国组织的一部分,网址为www.upu.int。这样您的编码就会准确无误。我还看到可以订阅大多数使用的代码列表的更新。已发布代码的完整列表可以在此处找到:http://www.upu.int/en/activities/standards/code-lists.html。 - Mark Langlois
20个回答

53

我想更新一下这个问题,因为我正在通过 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/

FedEX:(三种不同的)

/(\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$/
请注意,这些列表并不是我自己想出来的。我只是四处搜寻并从不同的来源(包括一些可能在此提及过的来源)进行了汇编。
谢谢。
编辑:修复了缺少结束分隔符的问题。

4
UPS还有邮件创新跟踪号码(http://www.ups.com/content/us/en/tracking/help/tracking/tnh.html),因此我必须修改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|\d{22})\b/i请注意,该正则表达式已经被修改以包含邮件创新跟踪号码。 - SS44
USPS将一些跟踪号更改为26个字符。使用:/(\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 - Ray
2
有一个名为 tracking_number 的 Ruby 库。它可以识别许多跟踪号码。我建议你去看看。 - DBagBaggerWithSwagger
@SS44,你的正则表达式匹配了USPS号码,所以它太宽松了。(9374889692090270407075是一个USPS号码,而你的正则表达式匹配了它) - stackOverFlew
我有点不懂正则表达式。你使用\d\d\d而不是\d{3}(等等)的原因是什么? - pbristow

11

我的使用情况需要更强大的东西。我一直在遇到一些例子,它们不完整、不正确或过于冗长,而没有任何正确性的改进。希望这可以帮助其他人!它涵盖了其他答案中的所有不同格式,还有一些其他内容,并且不像其他答案那样在FedEx和USPS之间重叠。

跟踪号正则表达式:

USPS/S10:

https://postalpro.usps.com/mnt/glusterfs/2020-02/Pub%20199%20Intelligent%20Mail%20Package%20Barcode%20(IMpb)%20Implementation%20Guide%202020_02_11%20TT%20v6.pdf

\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

FedEx:

\b([0-9]{12}|100\d{31}|\d{15}|\d{18}|96\d{20}|96\d{32})\b

注意事项/注释:

  • FedEx SmartPost被[有意地]归类为USPS;可以使用任一方式跟踪。
  • USPS包括用于国际邮件的S10格式的追踪号码。
  • 跟踪号码具有模块检查位;这些正则表达式不会检查它们。
  • 通过阅读规格说明书,阅读其他答案,查看开源代码等方式发现这个问题。我对6000个跟踪号码进行了测试匹配,百分之百准确,但我不能确定在所有情况下都正确。
  • 这些假设您在应用正则表达式之前已经删除了所有空格。

示例跟踪号码

大部分来自以下来源:

| 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             |

6

我需要验证仅限于美国邮政服务(USPS)的跟踪号码。WikiAnswers表示,我的号码格式如下:

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

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

我补充说,所有我过去两年个人发货的标签号码都以“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的正则表达式测试工具,此模式匹配我的两个测试字符串:
EXPRESS MAIL:EK225651436US
标签号码:9410803699300003725216
**注意:如果您正在使用ColdFusion(我正在使用),请从模式中删除第一个和最后一个“/”。

5

我向英国皇家邮政要求提供关于挂号信和特快专递的跟踪编号正则表达式,但并没有得到很好的回复。即使他们花费了一周时间提供了各种表示服务类型的字母组合,我仍然能够提供我们经验中的示例,证明还有其他显然有效但未被记录的组合。

这些参考编号遵循似乎是标准的国际格式,我认为Jefe的/^[A-Za-z]{2}[0-9]+GB$/正则表达式可以描述:

XX123456789GB

尽管这似乎是一个标准格式,即大多数国际邮件具有相同的格式,其中最后两个字母表示原产国,但我无法找到有关此“标准”的更多信息或其起源(欢迎任何澄清!)。

皇家邮政特有的是使用前两个字母来表示服务级别。我已经编制了一个表示特快专递的前缀列表,但我不确定它是否完全覆盖了所有情况:

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

如果没有这些前缀之一,该服务就是“挂号递送”,可以提供交付确认但无法跟踪。

通常情况下,S、X或Z的包含表示更高级别的服务。我从未见过任何一个普通的挂号递送物品具有这些字母中的任何一个作为前缀。

然而,正如您所看到的,如果要使用正则表达式检查服务级别,则需要测试许多前缀。考虑到英国皇家邮政似乎无法提供全面的规则集,因此尝试测试服务级别可能是徒劳的。


1
有一些代码被皇家邮政认为是无效的,因此我已经调整了上面的代码以排除它们:/(?!(EA|EB|EC|ED|EE|CP))[A-Za-z]{2}[0-9]{9}+GB/ 如果您的字符串只包含跟踪号码,则使用起始和结束符号,如下所示:/^(?!(EA|EB|EC|ED|EE|CP))[A-Za-z]{2}[0-9]{9}+GB$/ - Dan Mason
很棒的信息。你从哪里得到的? - Lunatik
如果您正在参考无效前缀,则可以在其网站上的文档中找到。http://www.royalmail.com/royal-mail-you/intellectual-property-rights/linking-our-website - Dan Mason

5

以下是来自美国主要运营商的一些示例号码:

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;

}

你如何处理重复匹配?例如,我遇到了一个问题,USPS的22位数字被UPS的正则表达式捕获(如果你看下面,Mail Innovations的数字可以是22-34位)。 - dataviews

4
我正在开发一个Angular2+应用程序,并编写了一个组件来处理常见的美国跟踪号码。我使用标准的JavaScript RegExp进行测试,这些RegExp是从这里这里获取的。如果跟踪号码有效,它会设置锚点标签上的href为跟踪链接URL。您不必使用Angular或TypeScript就可以轻松地将其适配到您的应用程序中。我使用不同的虚拟号码进行了测试,目前似乎可以动态工作。请注意,您也可以将最后一个else语句中的null替换为行内注释的url,这样它就会将您发送到Google搜索页面。
如果您有任何反馈(或者您的跟踪号码无法正常工作),请让我知道,我会更新答案。谢谢!
在HTML中的使用方法: 组件.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>

tracking-number-validation 是一个 JavaScript 库,在我的 React Native 项目中表现良好。 - gabe

3

我已经研究了一段时间,并基本上根据这里的答案制作了以下内容。
这些应该包括所有内容,而不会太宽松。
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正则表达式无法匹配与Adil的解决方案相同数量的跟踪号码:https://dev59.com/DHRB5IYBdhLWcg3wcm-d#5024011 - Jared Sealey
你在 UPS 正则表达式的末尾漏掉了一个 \s。我还将 $ 提取出来:/^(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 - jkelley
此外,USPS上有小的更改。其中一个\s应该是可选的,所以我添加了额外的?: /^(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 - jkelley

2

2
这里有一个很好的资源,涵盖了几乎所有可能性,并且非常紧凑:

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}$"
    };

1

以下是我在我的Java应用程序中现在使用的代码。这些代码是根据我从整个一堆drop ship服务的送货确认电子邮件中提取跟踪号码的经验确定的。我刚刚从头开始制作了一个新的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); 

对于这些跟踪电子邮件,您是否需要提取有关所发货物的信息?例如,订单号码、产品信息等等? - dataviews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接