web-dev-qa-db-fra.com

Modèles d’expression régulière pour les numéros de suivi

Est-ce que quelqu'un connaît le bon endroit ou les modèles pour vérifier quel numéro de suivi d'entreprise est le numéro de suivi donné pour un colis? Idea is Après avoir numérisé un code à barres pour rechercher un numéro de suivi de chèque d’emballage avec des modèles et indiquer le nom de la société par laquelle il a été expédié. 

54
Bob

Je pensais juste que je posterais une mise à jour à ce sujet car je travaille dessus pour apparier via jquery et sélectionner automatiquement le transporteur approprié. J'ai compilé une liste des expressions rationnelles correspondantes pour mon projet et j'ai testé de nombreux numéros de suivi dans UPS FedEX et USPS. 

Si vous rencontrez quelque chose qui ne correspond pas, faites-le-moi savoir ici via des commentaires et j'essaierai de le faire également.

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 différents)

/(\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 différents)

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

S'il vous plaît noter que je ne suis pas venu avec ces moi-même. J'ai simplement cherché et compilé la liste à partir de différentes sources, y compris celles qui ont peut-être été mentionnées ici.

Merci

Edit: Correction du délimiteur de fin manquant.

40
Adil

J'ai appuyé sur Royal Mail pour obtenir une regex pour les références de suivi Recorded Delivery & Special Delivery, mais je ne suis pas allé très loin. Même un ensemble complet de règles pour que je puisse me débrouiller allait au-delà.

Fondamentalement, même après avoir pris environ une semaine et renvoyé diverses combinaisons de lettres indiquant le type de service, j'ai pu fournir des exemples tirés de notre expérience montrant que d'autres combinaisons étaient évidemment valables mais qu'elles n'avaient pas été documentées.

Les références suivent le format international apparemment standard que, selon moi, le /^[A-Za-z]{2}[0-9]+GB$/ regex de Jefe décrirait:

XX123456789GB 

Même si cela semble être un format standard, c’est-à-dire que la plupart des courriers internationaux ont le même format où les deux dernières lettres indiquent le pays d’origine, je n’ai pas pu en savoir plus sur ce «standard» ni sur son origine. (toute clarification bienvenue!).

Royal Mail semble utiliser notamment les deux premières lettres pour indiquer le niveau de service. J'ai réussi à compiler une liste de préfixes indiquant une remise spéciale, mais je ne suis pas convaincu qu'elle soit complète à 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

Sans l'un de ces préfixes, le service est une livraison enregistrée qui donne une confirmation de livraison mais pas de suivi.

Il semble généralement que l’inclusion d’un S, X ou Z dénote un niveau de service supérieur et je ne pense pas avoir jamais vu un envoi avec livraison consigné normal comportant l’une de ces lettres dans le préfixe.

Cependant, comme vous pouvez le constater, de nombreux préfixes devraient être testés si le niveau de service était contrôlé à l'aide de regex. Compte tenu du fait que Royal Mail semble incapable de fournir un ensemble de règles complet, il peut être tentant de tester le niveau de service. futile.

5
Lunatik

Je dois vérifier les numéros de suivi JUST United States Postal Service (USPS). WikiAnswers dit que mes formats de nombres sont les suivants:

USPS propose uniquement le suivi avec Express courrier, avec commence généralement par un "E", une autre lettre, suivie de 9 chiffres, et deux autres lettres. USPS a "Numéros d'étiquette" pour d'autres services qui sont entre 16 et 22 chiffres longue.

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

J'ajoute que les numéros d'étiquettes commencent par un "9" comme tous ceux que j'ai des envois personnels des 2 dernières années commencent par un 9.

Donc, en supposant que WikiAnswers soit correct, voici mon regex qui correspond aux deux:

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

C'est assez simple. Voici la ventilation:

^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

En utilisant le testeur de regex de www.gummydev.com, ce motif correspond à mes deux chaînes de test:

COURRIER EXPRESS: EK225651436US

NUMÉRO D'ÉTIQUETTE: 9410803699300003725216

** Remarque: Si vous utilisez ColdFusion (I am), supprimez le premier et le dernier "/" du modèle.

3
molaro

Vous pouvez essayer ceux-ci (non garantis):

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

Mais s'il vous plaît tester avant de les utiliser. Je recommande RegexBuddy .

2
David Pokluda

Voici quelques exemples de numéros des principaux transporteurs américains:

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)

Modèles que j'utilise (code php). Oui j'ai abandonné et j'ai commencé à tester tous les modèles à ma disposition. J'ai dû écrire le deuxième 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;

}
2
stackOverFlew

Fait des recherches à ce sujet depuis un certain temps, et les base principalement sur les réponses fournies ici.
Celles-ci devraient tout couvrir, sans être trop indulgentes.
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

2
Josh Blancett

Au cas où cela aiderait les autres utilisateurs, voici une classe Python simple qui résout les formats courants: Gist # 541851

2
Erik Karulf

Découvrez ce projet github qui répertorie de nombreuses expressions rationnelles de suivi PHP. https://github.com/darkain/php-tracking-urls

1
integrii

Voici ceux que j'utilise maintenant dans mon application Java. Celles-ci sont déterminées par mon expérience de succion des numéros de suivi dans les courriels de confirmation d'expédition provenant de tout un tas de services de livraison directe. Je viens de créer un nouveau système USPS à partir de rien, car aucun de ceux que j'ai trouvés ne fonctionnait pour certains de mes numéros à partir d'exemples de numéros sur le site USPS. Ceux-ci ne fonctionnent que pour les codes de suivi américains, car nous ne vendons qu'aux États-Unis. 

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); 
1
Datbates

Je les utilise dans une application eBay que j'ai écrite:

USPS Domestic:

/^91[0-9]+$/

USPS International:

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

FedEx:

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

Toutefois, cela peut être spécifique à eBay/Paypal, car toutes les étiquettes USPS Domestic commencent par "91". Toutes les étiquettes USPS International commencent par deux caractères et se terminent par "US". Pour autant que je sache, FedEx utilise seulement 15 chiffres aléatoires.

(Veuillez noter que ces expressions rationnelles supposent que tous les espaces sont supprimés. Il serait cependant assez facile de permettre des espaces)

1
Jefe

Voici un regex à jour pour UPS (fonctionne avec les numéros de suivi habituels et de type 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?\d\d\d |\d {22,34})\b

0
user2242092

Je sais qu'il y a déjà beaucoup de réponses et que cela a été posé il y a longtemps, mais je ne vois pas de réponse unique adressant tous les numéros de suivi USPS possibles avec une seule expression.

Voici ce que je suis venu avec:

((\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})

Regardez le travail ici: http://regexr.com/3e61u

0
Joshua Goossen

Je suis aussi tombé sur des numéros de suivi de FedEx à 22 chiffres récemment, alors méfiez-vous!.

Exemple FedEx #: 9612019059803563050071

0
Soleone

Je crois que FedEx est composé de 12 chiffres:

^[0-9]{12}$
0
user282568

Cependant, tard dans la soirée, le numéro ci-dessous fonctionnera également avec les numéros USPS à 26 caractères.

/(\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
0
Ray

Je travaille dans une application Angular2 + et viens d'assembler un composant permettant de gérer les numéros de suivi américains courants. Il les teste à l'aide de JavaScript standard RegExp que j'ai mis en place à partir de cette ressource ICI & ICI et définit le href sur une balise d'ancrage avec l'URL du lien de suivi si elle est correcte. Vous n'avez pas besoin d'utiliser Angular ou TypeScript pour l'adapter facilement à votre application. Je l'ai testé avec différents nombres fictifs et semble fonctionner de manière dynamique jusqu'à présent. Veuillez noter que vous pouvez également désactiver la valeur null dans la dernière instruction else avec l'URL commentée en ligne et cela vous enverra vers une recherche Google. 

Tous les commentaires (ou si vos numéros de suivi ne fonctionnent pas) s'il vous plaît laissez-moi savoir que je mettrai à jour la réponse. Merci!

UTILISATION EN HTML:

<app-tracking-number [trackNum]="myTrackingNumberInput"></app-tracking-number>

COMPOSANT .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}`;
    }

}

COMPOSANT .HTML

<a *ngIf="trackNumHref" [href]="trackNumHref" target="_blank">{{trackNum}}</a>
<span *ngIf="!trackNumHref">{{trackNum}}</span>
0
Shane McCurdy