#java #regex
#java #регулярное выражение
Вопрос:
String data ="A486A946D48967E456F679B3425B234C847C
A725A872D74985E45346F679B86705B234C2847C
Output should be in format like below:
-486
-3425
-847
-725
-86705
-2847
Выше приведены данные, из которых я хочу извлечь значения. Они находятся в том же формате, например: A...A...D...E...F...B...B...C...C
где точки представляют числа.
Я хочу извлечь числа между A-A, B-B
и C-C
, как указано выше. Все эти данные хранятся в виде строки в одной строке. Я использовал сопоставитель шаблонов, но это не сработало. Пожалуйста, любые предложения.
Комментарии:
1. Используйте регулярное выражение
2. возьмите две переменные char prev и curr и проверьте, совпадают ли они или нет, обновляя обе переменные, если вы сталкиваетесь с символом, если они одинаковые, получите подстроку между ними
3. Не стесняйтесь обращаться к любым запросам
4. Какой шаблон сопоставления вы использовали?
5. @Sumeet Singh. Это именно то, чего я так сильно хотел.
Ответ №1:
Pattern pattern = Pattern.compile("([A-Z])(\d )\1");
Matcher m = pattern.matcher(data);
while (m.find()) {
String letter = m.group(1);
String digits = m.group(2);
int n = Integer.parseInt(digits);
System.out.printf("- %s = %d%n", letter, n);
}
Шаблон состоит из:
([A-Z])
= группа 1 с заглавной буквы(d )
= группа 2 с одной или несколькими цифрами1
= значение группы 1
Комментарии:
1. Только с этого сайта мне посоветовали не использовать шаблон и сопоставитель для тривиальных задач, потому что они чертовски медленнее, чем ваш код.
2. @SumeetSingh действительно, я поддержал ваш ответ, хотя следовало использовать StringBuilder . Здесь регулярное выражение подходит, так как нет необходимости в возврате (отмене ложных совпадений половин, циклах циклов). И решение проще, менее подвержено ошибкам, более понятно, поддерживается. Качество тоже имеет значение.
3. Я использовал String, только потому, что его использовал OP.
Ответ №2:
Вы можете использовать следующий код.
char c1 = '';
char c2 = '';
String str = "";
for(int i = 0;i < data.length(); i)
{
if(data.charAt(i) >= 65amp;amp;data.charAt(i) <= 90)
{
if(c1 == '')
c1 = data.charAt(i);
else if(c2 == '')
c2 = data.charAt(i);
if(c1 != '' amp;amp; c2 != '')
{
if(c1 == c2 amp;amp; str.length() != 0)
System.out.println("-" str);
str = "";
c1 = c2;
c2 = '';
}
}
else
str = data.charAt(i);
}
Комментарии:
1. Обычно рекомендуется использовать StringBuilder вместо String для создания строки путем конкатенации в цикле. (Т.е. String str должен быть StringBuidler ).