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

Java 用于验证重复字符计数的正则表达式模式,java,regex,char,Java,Regex,Char,我有一个字符串集合,我需要创建一个正则表达式模式来过滤掉那些重复字符只出现两次的字符串 例如:Arrays.asList(“abcdef”、“bababc”、“abbcde”、“abcccd”、“aabcdd”、“abcdee”、“ababab”) 在这里,我想以[“babac”,“abbcde”,“aabcdd”,“abcdee”]的结果结束。 因此,重复字符可以是连续字符或中间字符。但将一个字符重复两次的优先级高于任何其他重复计数 例如:“bababc”,其中'a'重复两次,'b'重复三次,

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

例如:
Arrays.asList(“abcdef”、“bababc”、“abbcde”、“abcccd”、“aabcdd”、“abcdee”、“ababab”)

在这里,我想以
[“babac”,“abbcde”,“aabcdd”,“abcdee”]的结果结束。

因此,重复字符可以是连续字符或中间字符。但将一个字符重复两次的优先级高于任何其他重复计数

例如:“bababc”,其中
'a'
重复两次,
'b'
重复三次,因为
'a'
重复两次,所以符合过滤条件

我尝试了不同的模式

  • 这仅在中间字符的情况下部分起作用,但也接受不重复的字符串
  • 它的一个变体是,在对字符串进行排序后,它部分用于连续字符
有人能帮我吗?

这个regexp有用吗

'^[^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]*$'
测试:


如果是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());
如果我们做一个小测试,只需打印结果:

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);

是的,我需要从列表中排除'abcdef',为什么输出中有'bababc'b'的计数为3。这是否意味着这里的'a'计数2优先?是的,字符计数2优先,抱歉我更新了问题我无法想象一个纯粹的正则表达式方法,因为你需要在当前选中的字符之前检查重复字符。我认为你发布的第二个选项有效-如果你愿意事先对字符串排序的话。只需将计数设置为{2},而不是{2,}。但是,如果您要先对它进行排序,那么您也可以创建一个函数来解析它。编辑:仔细想想,如果字符串的副本为3或更高,但没有副本为2,则它不能作为字符串使用,或者作为
数组的替代品。stream(s.split(“”)
s.chars().boxed()
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