Извлечение уникальных идентификаторов клиентов из текста

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

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

Любые идеи или примеры кода Java помогут. Спасибо

1 ответ

Решение

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

(?<![A-Za-z0-9])[A-Za-z0-9]{6,}

Я использовал здесь отрицательный взгляд вместо границы слова (\b), если в вашем тексте были подчеркивания. Если у вашего аромата регулярных выражений нет взгляда сзади, вы можете вместо этого использовать границу слова (но я отмечаю, что вы упомянули java в своем вопросе - а у java действительно есть lookbehind).

Если идентификатор клиента должен содержать число, то регулярное выражение для соответствия должно выглядеть так:

(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,}

Смотрите демонстрацию Regex101.

Существует ли ограничение на длину идентификаторов ваших клиентов? Если это так, то, вероятно, было бы полезно ввести этот предел - любая буквенно-цифровая последовательность символов длиннее этого числа, очевидно, не будет совпадением. Например, если ограничение составляет 25 символов, регулярное выражение будет выглядеть так:

(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,25}(?![A-Za-z0-9])

(Я добавил заглядывание в конце, иначе это могло бы просто соответствовать первым 25 символам длинной буквенно-цифровой последовательности!)

После того, как из вашего текста извлечены совпадения, вы можете выполнить поиск по словарю. Я знаю, что на Stackru есть вопросы и ответы на эту тему.

Чтобы фактически использовать это регулярное выражение в Java, вы должны использовать Pattern а также Matcher классы. Например,

String mypattern = "(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,25}(?![A-Za-z0-9])";
Pattern tomatch = Pattern.compile(mypattern);

И т.д. Надеюсь, это поможет.

ОБНОВИТЬ

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

Другие вопросы по тегам