【问题标题】:Regular Expression patterns for Tracking numbers跟踪号码的正则表达式模式
【发布时间】:2023-03-12 13:05:02
【问题描述】:

有没有人知道检查哪个公司跟踪号是包裹的给定跟踪号的好地方或模式。想法是在扫描条形码以获取带有图案的包裹检查跟踪号并显示它是由哪家公司运送的。

【问题讨论】:

  • 我看到很多人发布了一些模式。请记住,对于不同国家的国内货运和本地服务,快递服务有不同的 AWB/跟踪号格式。因此,请谨慎对待。
  • 如果您正在寻找有关所有邮政和包裹中使用的国际代码标准的更多信息,那么您可能应该参考联合国组织大家庭中的“万国邮政联盟”管理机构在www.upu.int 您的编码将是准确的,我还看到可以订阅大多数使用的代码列表的更新。可在此处找到已发布代码的完整列表:http://www.upu.int/en/activities/standards/code-lists.html

标签: regex fedex ups


【解决方案1】:

只是想我会发布一个更新,因为我正在处理这个以通过 jquery 匹配并自动选择合适的运输公司。我为我的项目编制了一个匹配的正则表达式列表,并且我在 UPS FedEX 和 USPS 上测试了很多跟踪号码。

如果您遇到不匹配的内容,请在此处通过 cmets 告诉我,我也会尝试解决。

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

请注意,这些不是我自己想出来的。我只是四处搜索并整理了来自不同来源的列表,包括这里可能提到的一些。

谢谢

编辑:修复了缺少的结束分隔符。

【讨论】:

  • UPS 也有 Mail Innovations 追踪号码 (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 包括这些
  • 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
  • 有一个名为 tracking_number 的 Ruby 库。识别跟踪号码有很大作用。我建议你检查一下。
  • @SS44 您的正则表达式读取的是 USPS 号码,所以它太松散了。 (9374889692090270407075 是 USPS 号码,您的正则表达式与之匹配)
  • 我有点像正则表达式 n00b。您使用\d\d\d 而不是\d{3}(等等)有什么原因吗?
【解决方案2】:

我的用例需要更强大的东西。我不断地遇到不完整、不正确或过于冗长的示例,而正确性没有任何改进。希望这对其他人有帮助!它涵盖了其他答案中的所有不同格式以及更多格式,并且与其他一些答案不同,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

联邦快递:

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

【讨论】:

    【解决方案3】:

    我需要验证 JUST 美国邮政服务 (USPS) 追踪号码。 WikiAnswers 说我的数字格式如下:

    USPS 仅提供 Express 追踪服务 邮件,通常以“E”开头, 另一个字母,后跟 9 位数字, 还有两个字母。 USPS 确实有 其他服务的“标签号码” 介于 16 到 22 位之间 长。

    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(我是),请从模式中删除第一个和最后一个“/”

    【讨论】:

      【解决方案4】:

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

      如果没有这些前缀之一,则服务是记录交付,它提供交付确认但不跟踪。

      一般来说,包含 S、X 或 Z 似乎表示更高的服务水平,我认为我从未见过在前缀中带有任何这些字母的普通 Recorded Delivery 项目。

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

      【讨论】:

      • 皇家邮政认为有些代码无效,所以我调整了以上内容以排除这些代码:/(?!(EA|EB|EC|ED|EE|CP))[A-Za-z]{2}[0-9]{9}+GB/ 如果您的字符串仅包含跟踪号,则使用开始和结束符号,如 @987654325 @
      • 很棒的信息。你从哪里得到的?
      • 如果您指的是无效前缀,那么它在他们网站上的文档中。 royalmail.com/royal-mail-you/intellectual-property-rights/…
      【解决方案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 位)。
      【解决方案6】:

      对此进行了一段时间的研究,主要根据此处的答案制作这些内容。
      这些应该涵盖所有内容,但不能过于宽松。
      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

      【讨论】:

      • USPS 正则表达式匹配的跟踪号码不如 Adil 的解决方案那么多:stackoverflow.com/a/5024011/1166066
      • 您在 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
      • 另外,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
      【解决方案7】:

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

      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

      【讨论】:

        【解决方案8】:

        我正在使用 Angular2+ 应用程序,只是将一个组件放在一起来处理常见的美国跟踪号。它使用我从该资源HEREHERE 汇总的标准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>
        

        【讨论】:

        【解决方案9】:

        我在自己编写的 eBay 应用程序中使用了这些:

        USPS 国内:

        /^91[0-9]+$/
        

        USPS 国际:

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

        联邦快递:

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

        但是,这可能是 eBay/Paypal 特定的,因为所有 USPS 国内标签都以“91”开头。所有 USPS International 标签均以两个字符开头并以“US”结尾。据我所知,FedEx 只使用 15 个随机数字。

        (请注意,这些正则表达式假定所有空格都已删除。但允许空格相当容易)

        【讨论】:

        • (更新这个多年前的答案,以防现在有人遇到):今天,USPS 国内号码以 92、93、94 或 95 开头。该号码是“渠道应用程序标识符”,这表明哪个 USPS 渠道发布了该号码(在邮局购买、在线购买等)。 91 已退役。
        【解决方案10】:

        查看这个 github 项目,其中列出了许多 PHP 跟踪正则表达式。 https://github.com/darkain/php-tracking-urls

        【讨论】:

          【解决方案11】:

          这是我现在在我的 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); 
          

          【讨论】:

          • 对于这些跟踪电子邮件,您是否必须提取有关已发货内容的信息?比如订单号、产品信息等?
          【解决方案12】:

          这是一个很好的资源,它涵盖了几乎所有的可能性,并且和我发现的一样紧凑:

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

          【讨论】:

            【解决方案13】:

            我相信 FedEx 是 12 位数:

            ^[0-9]{12}$
            

            【讨论】:

            • 可以是 12 或 22 个字符,因此:/^[0-9]{12,22}$/
            【解决方案14】:

            我最近还发现了 FedEx 的 22 位跟踪号码,所以要小心! 对于 FedEx 的一般格式,我还没有找到任何好的参考。

            联邦快递示例#:9612019059803563050071

            【讨论】:

            • 您应该将此作为评论放在问题中,因为该区域用于回答。如果你把它放在那里,其他人会很容易通知他们,这样他们就可以重写正则表达式或提出任何替代方案。
            • 请注意,“9612019”是某种前缀(FedEx Ground?),跟踪号可以缩写为“059803563050071”,是一个有效的 FedEx 跟踪号查找。
            【解决方案15】:

            然而,迟到的聚会,以下也适用于 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
            

            【讨论】:

              【解决方案16】:

              我知道已经有很多答案,而且很久以前就有人问过这个问题,但我没有看到一个可以用一个表达式解决所有可能的 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

              【讨论】:

                【解决方案17】:

                //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 最终字符串 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[A-Z]?|D[C-Z]|LK|E[A-C]|V[A-Z]|R[A-Z]|CP|CJ|LC|LJ) ?\d {3} ?\d{3} ?\d{3} ?[A-Z]?[A-Z]?)\b";

                //USPS - 美国邮政服务 - 格式 3 最终字符串 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 最终字符串 DHL = "\b(\d{4}[- ]?\d{4}[- ]?\d{2}|\d{3}[- ]?\d{8}|[A-Z{ 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/ 您可以通过此链接将您的正则表达式更改为另一种语言的正则表达式并生成代码。

                【讨论】:

                  【解决方案18】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-12-18
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多