Как найти динамическую подстроку в строке java android?
Всем привет, начал изучать программирование для андроид и написал простенькое приложение которое захватывае текст с камеры преобразовывает в строку и отправляет в новый активити, дальше я хочу перебрать эту строку, вычленить подстроки и по ним отправлять запросы на совпадение в базу. В частности сейчас в строке передаются добавки Е123, Е102 и т.д, а выводиться должно что это за добавка. Сложность в общем такая, как мне в строке отследить все «Е»-шки, игнорирую другие символы, при этом Е-шки записываются определенными правилами: Е всегда в верхнем регистре, после Е идут только цифры, некоторые ешки имеют еще после цифр букву, например «d», количество цифр и цифр плюс буква после символа Е может быть 3-4... Я думаю возможно нужно какое либо регулярное выражение написать, или ручками какой то алгоритм писать с кучей вложенных условий и циклов, подскажите знающие программеры как решить эту задачу?
Пример приходящей строки: «E123, E100, aqua, salt, E124d, sugar» PS: сочиненная строка
Ответы (1 шт):
Вариант решения задачи через обычный цикл и условия с комментариями-пояснениями.
Решить можно и через регулярки, даже код будет короче, но для понимания (на мой взгляд) регулярки сложнее.
// строка для поиска для теста (из вопроса)
String str = "E123, E100, aqua, salt, E124d, sugar";
// Здесь будем сохранять ответ (список найденных «Е»-шек)
List<String> answer = new ArrayList<String>();
// Идем в цикле по символам строки
int startCycle = 0; // начинаем с первого символа
int endCycle = str.length() - 3; // заканчиваем, когда остается 3 символа до конца («Е»-шка минимум 4 символа)
for (int i = startCycle; i < endCycle; i++) {
if (
str.charAt(i) != 'E' // Если по текущему индексу НЕ «Е»
|| !Character.isDigit(str.charAt(i + 1)) // Или хотя бы один из следующих трех символов НЕ цифра
|| !Character.isDigit(str.charAt(i + 2))
|| !Character.isDigit(str.charAt(i + 3)) // Заметим, что из-за выбранного endCycle мы точно знаем, что ещё три символа там есть!
) {
continue; // Переходим к следующему индексу
}
// Индекс символа, следующего за окончанием «Е»-шки
// Изначально +4 символа от текущего (случай, кога «Е» только из трех символов)
int endingIndex = i + 4;
if ( // Если
i + 4 < str.length() // Есть 4-й символ начиная от текущего (иначе можно выйти за пределы строки)
&& (
(str.charAt(i + 4) >= 'a' // и этот символ - маленькая латинская буква
&& str.charAt(i + 4) <= 'z')
||
(str.charAt(i + 4) >= 'A' // или большая латинская буква
&& str.charAt(i + 4) <= 'Z')
|| Character.isDigit(str.charAt(i + 4)) // или цифра
)
){
endingIndex = i + 5; // Индекс символа, следующего за окончанием «Е»-шки берем +5 от текущего (случай, кога «Е» из четырех символов)
}
// Берем подстроку от текущего индекса (включительно) до endingIndex (НЕ включительно)
String newAnswer = str.substring(i, endingIndex);
// Добавляем найденную подстроку в строку
answer.add(newAnswer);
}
// Печатаем ответ (или возвращаем)
System.out.println(answer.toString());