Подтвердить что ты не робот

Регулярные выражения для отслеживания номеров

Кто-нибудь знает хорошее место или шаблоны для проверки того, какой номер отслеживания компании является данным номером отслеживания для пакета. Идея - после сканирования штрих-кода для проверки номера отслеживания пакета с шаблонами и показать, к какой компании он был отправлен.

4b9b3361

Ответ 1

Просто подумал, что я опубликую обновление по этому вопросу, так как я работаю над этим, чтобы соответствовать через jquery и автоматически выбирать соответствующий носитель. Я собрал список подходящего регулярного выражения для моего проекта, и я проверил множество номеров отслеживания в UPS FedEX и USPS.

Если вы сталкиваетесь с чем-то, что не соответствует, пожалуйста, дайте мне знать здесь через комментарии, и я постараюсь также придумать это.

ИБП:

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

Обратите внимание, что я сам не придумал их. Я просто искал и компилировал список из разных источников, в том числе некоторые из них, которые, возможно, были упомянуты здесь.

Спасибо

Изменить: Исправлен недостающий разделитель.

Ответ 2

Я нажал кнопку "Royal Mail" для регулярного выражения для заметок "Записанная доставка" и "Специальная доставка", но не очень далеко. Даже полный набор правил, чтобы я мог катиться самостоятельно, был за ними.

В принципе, даже после того, как они заняли около недели и вернулись с различными комбинациями букв, обозначающих тип сервиса, я смог привести примеры из нашего опыта, который показал, что были дополнительные комбинации, которые были явно действительны, но что они не документировали.

Ссылки следуют, по-видимому, стандартным международным форматам, которые, как мне кажется, описывается Jefe /^[A-Za-z]{2}[0-9]+GB$/ regex:

XX123456789GB

Несмотря на то, что это, по-видимому, стандартный формат, то есть большинство международных писем имеет тот же формат, где последние две буквы обозначают страну происхождения, я не смог больше узнать об этом "стандарте" или где он исходит из (любое разъяснение приветствуется!).

В частности, Royal Mail, по-видимому, использует первые две буквы для обозначения уровня обслуживания. Мне удалось скомпилировать список префиксов, которые обозначают специальную доставку, но я не уверен, что он на 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 с любой из этих букв в префиксе.

Однако, как вы можете видеть, существует множество префиксов, которые необходимо будет протестировать, если бы уровень сервиса должен был быть проверен с помощью регулярного выражения, и учитывая тот факт, что Royal Mail кажется неспособным предоставить полный набор правил, а затем попытаться проверить работу службы уровень может быть бесполезным.

Ответ 3

Мне нужно проверить номера отслеживания JUST United States Postal Service (USPS). WikiAnswers говорит, что мои числовые форматы выглядят следующим образом:

USPS предлагает только отслеживание с помощью Express mail, обычно начинается с буквы "E", другое письмо, за которым следуют 9 цифр, и еще два письма. У USPS есть "Номера ярлыков" для других служб которые составляют от 16 до 22 цифр долго.

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

Я добавляю, что номера ярлыков начинаются с "9", поскольку все те, что у меня есть из личных поставок в течение последних двух лет, начинаются с 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

В случае, если это помогает кому-либо еще найти это, вот простой класс Python, который разрешает общие форматы: Gist # 541851

Ответ 5

Проанализировав это какое-то время, я сделал это в основном на ответах здесь. Они должны охватывать все, не будучи слишком снисходительным.
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

Ответ 6

Вот несколько примеров номеров от основных американских перевозчиков:

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-код). Да, я сдался и начал тестировать все имеющиеся у меня модели. Пришлось написать второй ИБП.

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;

}

Ответ 7

Вы можете попробовать их (не гарантируется):

ИБП:

\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

ИБП:

\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

Но проконсультируйтесь, прежде чем использовать их. Я рекомендую RegexBuddy.

Ответ 8

Я использую их в приложении eBay, которое я написал:

USPS Внутренние:

/^91[0-9]+$/

USPS International:

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

FedEx:

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

Однако это может быть спецификацией eBay/Paypal, так как все национальные ярлыки USPS начинаются с "91". Все лейблы USPS International начинаются с двух символов и заканчиваются "US". Насколько мне известно, FedEx использует только 15 случайных цифр.

(Обратите внимание, что эти регулярные выражения предполагают, что все пробелы удалены. Было бы довольно легко разрешить пробелы, хотя)

Ответ 10

Я считаю, что FedEx составляет 12 цифр:

^[0-9]{12}$

Ответ 11

Я также встретил отслеживающие номера от FedEx с 22 цифрами в последнее время, так что следите! Я еще не нашел хороших ссылок для общего формата FedEx.

Пример FedEx №: 9612019059803563050071

Ответ 12

Здесь обновляется регулярное выражение для ИБП (работает с обычными и почтовыми индексами отслеживания номеров):

\ 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

Ответ 13

Вот те, которые я сейчас использую в своем приложении 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); 

Ответ 14

Поздно к стороне, однако, ниже будет работать с 26 char номерами 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

Ответ 15

Я знаю, что есть много ответов и что это было задано давно, но я не вижу ни одного, который учитывал бы все возможные номера отслеживания 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

Ответ 16

Я работаю в приложении Angular2+ и просто собираю компонент для обработки общих номеров отслеживания в США. Он тестирует их, используя стандартный JavaScript RegExp, который я собрал из этого ресурса ЗДЕСЬ и ЗДЕСЬ, и устанавливает href для тега привязки с URL-адресом ссылки отслеживания, если это хорошо. Вам не нужно использовать Angular или TypeScript, чтобы легко адаптировать его к вашему приложению. Я проверил это с разными фиктивными числами и до сих пор работал динамически. Обратите внимание, что вы также можете отключить значение NULL в последнем операторе else с помощью встроенного URL-адреса с комментариями, и он отправит вас на поиск в 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.
    inCAPost: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.inCAPost.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>