Одинаковые символы regex

319
10 мая 2018, 08:45

Возможно ли с помощью regex найти одинаковые буквы в строке (встречаются несколько раз)? Пример: "Привет, как дела?" Совпадения: е, к, а.

Answer 1

Можно использовать просмотр вперед и применить выражение (\p{L})(?=.*\1).

Пример кода:

Pattern p = Pattern.compile("(\\p{L})(?=.*\\1)");
Matcher m = p.matcher("Привет, как дела?");
while (m.find()) {
    System.out.println(m.group());
}

Само выражение по частям:

(\p{L}) — буква
(?=.*\1) —  та же буква (\1) в оставшейся части строки

Обратите внимание, что если буква встретится три или более раз, то выражение отловит каждое вхождение кроме последнего.

Answer 2

Предлагаю искать их не регулярками:

    HashMap<Character, Integer> map = new HashMap<>();
    String str = "Привет, как дела?";
    for(Character c: str.toCharArray()) { // набиваем хешмапу
      map.put(c,map.get(c)==null ? 1 : map.get(c) + 1);
    }
    System.out.println(
      map.entrySet().stream()
         .filter(cnt -> Character.isLetter(cnt.getKey()) && cnt.getValue() > 1) // фильтруем
         .map(e -> e.getKey())
         .collect(Collectors.toList()) // собираем список
    );  

Live Demo

Answer 3

В данном случае можно найти первую совпадающую подстроку регуляркой "([а-яА-Я]).*\1". Регулярка найдет "ет, как де" а дальше провяться будет только оставшийся текст. Логичнее делать циклом.

Answer 4

Ответ похож на ответ @defaultlocale, но:

  • если символ встречается более двух раз, он выводится только единожды
  • проверяются не буквы, а любые символы
  • порядок вывода - по предпоследнему вхождению (ba и zy в примере)

https://ideone.com/UimHaP

import java.util.regex.*;
class Ideone {
  public static void main (String[] args) throws java.lang.Exception {
    Pattern p = Pattern.compile("(.)(?=((?!\\1).)*\\1(?!.*\\1))");
    for (Matcher m = p.matcher("abacaba dx xyzzzyy"); m.find(); ) {
      System.out.print(m.group());
    }
  }
}
ba xzy
Answer 5
public class common {
public static void main(String args[]){
    String line = "Привет, как дела? Yeah, amazing! How about you?"; //сама строчка.
    int []arr = new int[1150]; // Array на 1150 символов, чтобы можно было записать значения в ASII английские и русские буквы
    for(int i = 0; i < line.length(); i++){
            int index = (int) line.toLowerCase().charAt(i);
            if ((index > 96 && index < 123) || index > 1000 ) {
                arr[index]++;
            }
    }
    System.out.println("Часто повторяющиеся буквы");
    for (int i = 0; i < arr.length; i++) {
        if(arr[i] > 1) {
            System.out.println("character: "+ Character.toString ((char) i) + " " + arr[i]);
        }
    }
}

}

Answer 6
(е|к|а)(?=.*\1?)

Результат: Привет, как дела?

READ ALSO
Как изменить параметры IntentFilter( "android.intent.action.TIME_TICK)

Как изменить параметры IntentFilter( "android.intent.action.TIME_TICK)

У меня возникла необходимость использовать для вызова уведомлений broadcast, и у меня возникла проблема: я хочу, чтобы уведомления приходили...

234
SQLException: Public Key Retrieval is not allowed

SQLException: Public Key Retrieval is not allowed

Всем привет! Я новичок в Java, и не могу понять суть происходящегоЕсть mysql server v8 и connector v8, всё с официального сайта mysql

392
Сервер дублирует сообщения

Сервер дублирует сообщения

Приложение-чатик клиент/сервер

295
Android Studio, не добавляет запись в БД Sqlite

Android Studio, не добавляет запись в БД Sqlite

Подскажите пожалуйста, почему может не добавляться запись в БД? Никакой ошибки не возникает, всё работает, но запись просто не добавляет

253