Как перехватить повторяющуюся ди git с помощью REGEX в следующем примере - PullRequest
0 голосов
/ 08 апреля 2020

Мы просто используем простой JavaScript .match () с помощью REGEX, у меня проблема с соответствием приведенному ниже REGEX pattern.

После сканирования приведенного ниже QR-кода я пытаюсь сопоставить серийный номер число, которое равно 682321973 при использовании приведенного ниже REGEX

(?:(?:(?:[a-zA-Z0-9-])|(?:\u001d))*21([a-zA-Z0-9-]{1,15})\u001d.*$)|(?:S?([a-zA-Z0-9-]{1,18}))

Причина использования этого БОЛЬШОГО регулярного выражения заключается в том, что SERIAL число начинается после (21) на изображении ниже (21) 682321973
Таким образом, мы будем игнорировать, или мы не будем фиксировать число или буквы до (21), как только оно совпадет с (21), мы захватим оставшееся число, т.е. 682321973

Но проблема в том, НИЖЕ регулярное выражение не совпадает, потому что есть повторение числа 21 в серийном номере 682321973 Результат 973

Но странная вещь в серийном номере, если есть 22 то есть 682322973 вместо 682321973 тогда мы получаем правильный результат, т.е. 682322973

Когда мы сканируем приведенный ниже QR-код,
текст, который мы получаем: "\u001d010405686902130021682321973\u001d24011020250\u001d422276" (без кавычек)

Фрагмент, который я получаю неверный результат для серийного номера 682321973 Примечание: в приведенном ниже результате мы берем индекс 1 в результате

const string = "\u001d010405686902130021682321973\u001d24011020250\u001d422276";
const regex = "(?:(?:(?:[a-zA-Z0-9-])|(?:\u001d))*21([a-zA-Z0-9-]{1,15})\u001d.*$)|(?:S?([a-zA-Z0-9-]{1,18}))";
const result = string.match(regex);

console.log(result);
// expected output: Array ["12344", "682321973"]

Фрагмент, который я получаю правильный результат для серийного номера 682322973

const string = "\u001d010405686902130021682322973\u001d24011020250\u001d422276";
    const regex = "(?:(?:(?:[a-zA-Z0-9-])|(?:\u001d))*21([a-zA-Z0-9-]{1,15})\u001d.*$)|(?:S?([a-zA-Z0-9-]{1,18}))";
    const result = string.match(regex);

    console.log(result);
    // expected output: Array ["12344", "682322973"]

Так может кто-нибудь, пожалуйста, помогите мне, если число повторяется в серийном номере 682321973 Мне нужно это, чтобы захватить 682321973 вместо просто 973

GS1 DATA Matrix

Для справки Ниже прикреплен еще один, просто чтобы серийный номер всегда начинался с (21)
, Another Bar code image

1 Ответ

0 голосов
/ 08 апреля 2020

Строка

\u001d010405686902130021682321973\u001d24011020250\u001d422276

состоит из 3 частей:

\u001d010405686902130021682321973
\u001d24011020250
\u001d422276

, которые в данном случае имеют разную длину.

Здесь содержится серийный номер в первом из них (хотя это не видно из данных). Эта строка может рассматриваться как состоящая из четырех частей, которые могут быть получены тремя возможными способами:

\u001d 01040568690 21 30021682321973
\u001d 0104056869021300 21 682321973
\u001d 0104056869021300216823 21 973

Соответствующими серийными номерами являются 30021682321973, 682321973 и 873. Хотя нам сказали, что 682321973 является действительным серийным номером здесь, поскольку серийные номера имеют от 1 до 18 цифр, все они потенциально дают правильное значение.

Единственный способ определить, какой, если таковой имеется из этих серийных номеров правильно лежит во второй группе цифр:

01040568690             (11 digits)
0104056869021300        (16 digits)
0104056869021300216823  (22 digits)

Если эта группа всегда содержит 16 цифр (как это происходит в двух приведенных примерах), мы можем извлечь серийные номера с помощью регулярного выражения

(?<=\\u\d{3}d\d{16}21)\d+(?=\\u\d{3}d)

Демо

Javascript Механизм регулярных выражений не распознает символы Юникода. Следовательно, \u001d рассматривается как обратная коса sh, за которой следует буква u, за которой следуют цифры 001, за которыми следует буква d.

Механизм регулярных выражений выполняет следующие операции.

(?<=      # begin positive lookbehind
  \\      # match '\'
  u       # match 'u'
  \d{3}   # match 3 digits (or replace with '001' if appropriate)
  d       # match 'd'
  \d{16}  # match 16 digits
  21      # match '21'
)         # end positive lookbehind  
\d+       # match 1+ digits (serial number) 
(?=       # begin positive lookahead
  \\      # match '\'
  u       # match 'u'
  \d{3}   # match 3 digits (or replace with '001' if appropriate)
  d       # match 'd'
)         # end positive lookahead

Если часть строки между \u001d и 21, которая непосредственно предшествует серийному номеру, не всегда состоит из 16 цифр, единственный оставшийся способ надежно извлечь серийный номер - это разбить эту строку. часть строки в ее составные элементы, но нам не сказали, что это за компоненты.

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