Извлечение значений между двумя одинаковыми буквами в java

#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 ).