регулярное выражение для поиска подстроки (номерного знака транспортного средства) в matlab из длинной строки?


У меня есть длинная строка типа " sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f "из этой строки я должен извлечь" AP09BN7886", который на самом деле является номерным знаком автомобиля в Индии. Я знаю, что, возможно, проще всего использовать регулярное выражение, может ли кто-нибудь сказать мне reg. exp, чтобы найти это.

3 2

3 ответа:

Как я понимаю формат , индийские номерные знаки:

  1. две прописные латинские буквы, представляющие индийский штат-так что это [A-Z]{2}
  2. две цифры, представляющие последовательный номер в этом состоянии, так что это \d{2}
  3. затем четыре цифры, префиксированные буквами, когда они заканчиваются цифрами; так что [A-Z]*\d{4}

(Число 1 и число 2 вместе взятые являются RTO по штату и району)

Вы пытаетесь собрать компоненты из длинной строки, и вы не указали достаточно подробно другие части строки, чтобы полностью устранить двусмысленность (например: буквы все строчные или нелатинские символы? Только один номерной знак на строку? Только две буквы, предваряющие четыре цифры? и т. д.) Поскольку это неизвестно, Вы можете представить "море" символов между группами совпадений с помощью .*?

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

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

([A-Z]{2}).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})
Затем объедините четыре группы захвата.

Демо

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

Например:

(AS|NL|MH  etc).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})

Или используйте более полный матч по RTO

Если вы можете дополнительно уточнить, что такое "другое" между группами захвата, вы можете использовать класс отрицательных символов или якорь.* чтобы быть более точным:
# pseudo regex...
# XXX is (match or skip or anchor the in between stuff...)

(AS|NL|MH  etc)XXX(\d{2})XXX([A-Z]*)XXX(\d{4})
Тогда вам нужно подумать об исключениях (специальные коды региона Дели, дипломатические номера, номера тщеславия, военные номера, o boy...)

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

s = 'sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f';
s(s~=upper(s) | s==32) = [];

Лучший,

Рабочий пример в Matlab:

str = ['sdnak hsd fds 57 fnsdf APsdf09sdf BN fddsdalf 7886sd f'];
expression = '([A-Z]{2}).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})'
tokens = regexp(str,expression,'tokens')
result = cell2mat(tokens{1})
-----------------------------------------------------------------
result = AP09BN7886