我有一个字符串集合,我需要创建一个正则表达式模式来过滤出重复字符仅出现两次的字符串。
例如:Arrays.asList("abcdef","bababc","abbcde","abcccd","aabcdd","abcdee","ababab");
在这里,我想得出的结果是["bababc","abbcde","aabcdd","abcdee"]
因此重复字符可以是连续字符,也可以是中间字符。但是,两次重复字符比任何其他重复计数都具有优先权
例如:“ bababc” ,其中'a'
被重复两次,'b'
被重复三次,因为'a'
被重复两次,因此有资格获得过滤。
我尝试了提到的不同模式
有人可以帮我吗?
答案 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