Шаблоны регулярных выражений для номеров отслеживания - PullRequest
55 голосов
/ 06 марта 2009

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

Ответы [ 16 ]

41 голосов
/ 17 февраля 2011

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

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

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

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

Спасибо

Редактировать: Исправлен пропущенный конечный разделитель.

5 голосов
/ 21 августа 2010

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

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

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

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

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

3 голосов
/ 24 июня 2010

Мне нужно проверить только номера отслеживания Почтовой службы США (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 (I), удалите первый и последний знак "/" из шаблона

2 голосов
/ 20 декабря 2016

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

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;

}
2 голосов
/ 19 августа 2011

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

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

2 голосов
/ 06 марта 2009

Вы можете попробовать это (не гарантировано):

* * UPS 1002
\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 1005
\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 .

1 голос
/ 03 июня 2015

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

Проверьте этот проект github, в котором перечислено множество регулярных выражений для отслеживания PHP. https://github.com/darkain/php-tracking-urls

1 голос
/ 27 июля 2009

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

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

/^91[0-9]+$/

USPS International:

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

FedEx:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...