Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#java #регулярные_выражения


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


Ответы

Ответ 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) в оставшейся части строки Обратите внимание, что если буква встретится три или более раз, то выражение отловит каждое вхождение кроме последнего.

Ответ 2



Предлагаю искать их не регулярками: HashMap 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

Ответ 3



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

Ответ 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

Ответ 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]); } } } }

Ответ 6



(е|к|а)(?=.*\1?) Результат: Привет, как дела?

Комментариев нет:

Отправить комментарий