正则表达式模式验证重复字符的计数

时间:2018-12-03 09:22:10

标签: java regex char

我有一个字符串集合,我需要创建一个正则表达式模式来过滤出重复字符仅出现两次的字符串。

例如:Arrays.asList("abcdef","bababc","abbcde","abcccd","aabcdd","abcdee","ababab");

在这里,我想得出的结果是["bababc","abbcde","aabcdd","abcdee"]

因此重复字符可以是连续字符,也可以是中间字符。但是,两次重复字符比任何其他重复计数都具有优先权

例如:“ bababc” ,其中'a'被重复两次,'b'被重复三次,因为'a'被重复两次,因此有资格获得过滤。

我尝试了提到的不同模式

  • here仅在使用中间字符的情况下才部分起作用,但也可以使用没有重复的字符串
  • here的一种变体,在对字符串进行排序之后,此部分函数可与连续字符一起使用

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

如果是Java,我建议使用Java代替正则表达式来解决此问题,它很简单,并且在有新要求的情况下可以很容易地扩展它:

//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

答案 1 :(得分:0)

此正则表达式会帮助您吗?

'^[^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