Шаблон регулярного выражения Для проверки количества повторяющихся символов - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть коллекция строк, мне нужно создать шаблон регулярных выражений, чтобы отфильтровать строки, которые имеют повторяющиеся символы, появляются только дважды.

Например: Arrays.asList("abcdef","bababc","abbcde","abcccd","aabcdd","abcdee","ababab");

Здесь яхочу получить в результате ["bababc","abbcde","aabcdd","abcdee"]

Таким образом, повторяющийся символ может быть последовательным или промежуточным символом. Но дублирование символа дважды имеет приоритет над любым другим счетчиком дублирования

Например: "bababc" , где 'a' повторяется дважды и 'b' повторяется три раза, так как 'a' повторяется дважды, он получает право на фильтрацию.

Я пытался супомянутые различные образцы

  • здесь это работает частично только в случае промежуточного символа, но также принимает строку без дубликатов
  • Вариант этого здесь , это работает частично с последовательными символами после сортировки строки

Может кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Если это Java, я предлагаю использовать java для решения этой проблемы, а не regex, это просто, и вы можете очень легко расширить его, если появятся новые требования:

//wordList is your string list
List<String> newList = wordList.stream()
             .filter(s -> Arrays.stream(s.split(""))                                                       
             .collect(groupingBy(identity(),ounting())).values().stream().anyMatch(c -> c == 2))
                                           .collect(Collectors.toList());

некоторые статические импорты:

import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

Если мы проведем небольшой тест, просто распечатаем результат:

List<String> wordList = Arrays.asList("abcdef", "bababc", "abbcde", "abcccd", "aabcdd", "abcdee", "ababab");
wordList.stream()
        .filter(s -> Arrays.stream(s.split(""))
                           .collect(groupingBy(identity(), counting())).values().stream().anyMatch(c -> c == 2))
        .forEach(System.out::println);

У нас есть:

bababc
abbcde
aabcdd
abcdee
0 голосов
/ 03 декабря 2018

Поможет ли это регулярное выражение?

'^[^a]*a[^a]*a[^a]*$|^[^b]*b[^b]*b[^b]*$|^[^c]*c[^c]*c[^c]*$|^[^d]*d[^d]*d[^d]*$|^[^e]*e[^e]*e[^e]*$'

Тест:

$ cat abcde.txt
abcdef
bababc
abbcde
abcccd
aabcdd
abcdee
ababab

$ egrep '^[^a]*a[^a]*a[^a]*$|^[^b]*b[^b]*b[^b]*$|^[^c]*c[^c]*c[^c]*$|^[^d]*d[^d]*d[^d]*$|^[^e]*e[^e]*e[^e]*$' abcde.txt
bababc
abbcde
aabcdd
abcdee
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...