Найти подстроку на основе определенного формата (7 цифр, затем 1 заглавная буква)

В моем тексте OCR я получаю вывод, как это …

"responses": [
{
"textAnnotations": [
{
"locale": "fr",
"description": "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt.

Я хочу получить значение «6392682B» (8 буквенно-цифровых символов). Числа и последний символ будут отличаться на разных изображениях. Единственная стандартная часть — это длина, которая составляет 8 символов (первые 7 будут цифрами, а последняя — буквой).

Я пробовал с:

preg_match_all("/(\d{7})/", $str, $ar);

Первые 7 числовых значений и последний алфавит.

1

Решение

$description = "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt.";

Буквально соответствует 7 цифрам, затем 1 заглавному алфавитному символу: (демонстрация)

echo preg_match('/\d{7}[A-Z]/',$description,$out)?$out[0]:'not found';

Если вы знаете, что ваша подстрока следует сразу за первой строкой чисел и пробелом:

echo preg_match('/\d+ \K\d{7}[A-Z]/',$description,$out)?$out[0]:'not found';

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

echo preg_match('/\b\d{7}[A-Z]\b/',$description,$out)?$out[0]:'not found';

Это проверит, что последовательность цифр не 8 или более и что нет буквенно-цифрового символа или подчеркивания после заглавной буквы желаемой подстроки.

Если вы знаете положение своей подстроки, вы можете даже сопоставить ее на основе предшествующих символов & следуй за ним:

echo preg_match('/ \K[^\n]+/',$description,$out)?$out[0]:'not found';

Некоторые дополнительные уточнения:

\K указывает, где начинать совпадение полной строки, поэтому нет необходимости в группе захвата.

\b это метасимвол регулярного выражения, называемый «граница слова».

Использование якоря ^ в начале строки полезно только в том случае, если вы ЗНАЕТЕ, что искомая подстрока следует за строкой чисел и пробелом.

Флаг Юникода не нужен, потому что в вашем ШАБЛОНЕ нет символов Юникода.

Вы можете проверить мои образцы в regex101.com Выбор наиболее точного и эффективного шаблона может быть определен только после полного понимания изменчивости вашей входной строки ($description). Я не буду делать никаких предположений о положении подстроки в строке.

Единственное, в чем я могу быть абсолютно уверен — это шаблон сопоставления, основанный на предоставленных вами данных: 7 цифр и 1 заглавная буква. Это именно то, что делают мои первый, второй и третий паттерны.

Первый образец Франческо будет соответствовать: AAAAAAAAAAAAAAAAA, 11111111111111111111, 1A2S3D4F5G6H7J8K9L0
Второй шаблон Франческо будет соответствовать: ZZZZZZZZ, 99999999, A1B2C3D4

Это делает его схему неточной / плохой / вводящей в заблуждение, и, вероятно, научит будущих читателей SO плохим практикам регулярных выражений … не говоря уже о том, что может испортить ваш проект!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector