Как сопоставить точные комбинации букв и цифр в пределах известной длины? - PullRequest
2 голосов
/ 05 марта 2019

У меня есть приложение C #, которое импортирует данные о клиентах, и я нахожу один случай использования сложным.Во-первых, вот несколько примеров строк:

Z20Q

M20A1070A20T

M20A1070D03D0480A20B

Мне нужно регулярное выражение ac # для извлечения либоиз следующих шаблонов, так часто, как они встречаются, где L = буква и N = номер:

LNNL или LNNLNNNN

Вы можете рассчитывать на следующее:

  1. Шаблоны не могут перекрываться.Как только совпадение найдено, извлеките этот сегмент и посмотрите только на все оставшиеся строки, которые еще не сопоставлены.
  2. Каждый символ строки будет совпадать - ни один символ (символы) никогда не будет отброшен.
  3. Должен попытаться сопоставить LNNLNNNN, прежде чем пытаться сопоставить LNNL.Если LNNLNNNN совпадает, извлеките его и продолжайте пытаться сопоставить все, что осталось от строки.
  4. Длина и расположение этих образцов являются точными, и на них можно рассчитывать.Но, как вы можете видеть из моего примера строк, длина строк может варьироваться.
  5. Каждая извлеченная / совпавшая строка должна быть ровно 4 символа или ровно 8 символов.
  6. Количество символов каждой строкибудет кратным 4: 4, 8, 12, 16, 20 (я не думаю, что их может быть больше 20)
  7. Строки будут состоять исключительно из буквенно-цифровых символов - без пробелов или специальных символов- только буквы и цифры

Итак, давайте пройдемся по нескольким:

Z20Q - все готово - если это 4 символа, мне не нужно регулярное выражение,Я могу взять его и пойти.

M20A1070A20T должен произвести и извлечь 2 строки: M20A1070 (соответствует шаблону LNNLNNNN) и A20T (соответствует шаблону LNNL)

M20A1070D03D0480A20B должен создать и извлечь 3 строки: M20A1070 (соответствует шаблону LNNLNNNN) и D03D0480 (соответствует шаблону LNNLNNNN) и A20B (соответствует шаблону LNNL)

Я изучал этот стековый пост , глядя на ^[G][0-9]{1,5}?$|^[G][0-9]{4}[A-Z]?$ - который выглядит как промисинНачну, но мое регулярное выражение кунг-фу слабое, и я был бы очень признателен за некоторые советы.

1 Ответ

5 голосов
/ 05 марта 2019

Следующее должно делать то, что вы хотите:

var input = "M20A1070D03D0480A20B";
var regex = new Regex("[A-Z][0-9]{2}[A-Z]([0-9]{4})?");

foreach(var match in regex.Matches(input).Cast<Match>().Select(x=>x.Value))
{
    Console.WriteLine(match);
}

Вывод:

M20A1070
D03D0480
A20B

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

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

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