【问题标题】:Regex Pattern To validate count of duplicate character正则表达式模式验证重复字符的计数
【发布时间】:2019-05-04 13:35:57
【问题描述】:

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

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

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

所以重复字符可以是连续字符或中间字符。但是重复字符两次优先于任何其他重复计数

例如:"bababc" ,其中'a' 重复两次,'b' 重复三次,因为'a' 重复两次它符合过滤条件。

我尝试了提到的不同模式

  • here 这部分仅在中间字符的情况下有效,但也采用不重复的字符串
  • 这是here 的一种变体,在对字符串进行排序后,这部分适用于连续字符

有人可以帮我吗?

【问题讨论】:

  • 是的,我需要从列表中排除“abcdef”
  • 为什么输出中有'bababc'? 'b' 的计数为 3。这是否意味着此处的 'a' 计数为 2 优先?
  • 是的 char count count of 2 优先,抱歉我更新了问题
  • 我无法在这里想象一个纯粹的正则表达式方法,因为您需要在当前检查的字符之前检查重复字符。
  • 我认为您发布的第二个选项有效 - 如果您愿意事先对字符串进行排序。只需将计数设置为 {2} 而不是 {2,}。但是,如果您要先对其进行排序,那么您不妨创建一个函数来解析它。编辑:再想一想,这不适用于重复 3 及以上的字符串,但如果没有重复 2,仍然会被捕获

标签: java regex char


【解决方案1】:

如果是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

【讨论】:

  • 或者作为Arrays.stream(s.split(""))s.chars().boxed()的替代品。
【解决方案2】:

这个正则表达式有帮助吗?

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

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2013-08-04
    相关资源
    最近更新 更多