有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于检测重复符号的java正则表达式

我正在寻找能够检测字符串中重复符号的正则表达式。目前,我还没有找到满足我所有需求的解决方案

要求非常简单:

  • 检测字符串中的任何重复符号
  • 能够设置重复计数(如超过两次)

所需检测的示例(符号“a”,超过2次,如果检测到则为真,否则为假)

“Abcdefg”-

“AbcdaBCD”-

“abcd_ab_ab”-(符号“a”用了三次)

“aabbaabb”-(符号“a”使用了四次)

由于我不是正则表达式的专家,使用它们-代码片段和解释将不胜感激

谢谢


共 (3) 个答案

  1. # 1 楼答案

    试试这个正则表达式:(.)(?:.*\1)

    它基本上匹配任何字符(.),后跟任何字符.*和它本身\1。如果要检查2个或更多重复,请仅在末尾添加{n,},其中n是要检查的重复次数

  2. # 2 楼答案

    我认为

    (.).*\1
    

    将工作:

    • (.)匹配单个字符并捕获
    • .*匹配任何中间字符
    • \1再次匹配捕获的组

    (如果字符串包含通常与.不匹配的字符,则需要使用DOTALL标志进行编译,或者将.替换为[\s\S]或类似内容)

    如果您想要求至少找到3次,只需更改后两个项目符号的量词:

    (.)(.*\1){2}
    

    等等

    但是这将是非常低效的,因为它必须在字符串中的每个字符和字符串末尾之间进行“搜索下一个匹配字符”,使其至少是二次的

    你最好不要使用正则表达式,例如

    char[] cs = str.toCharArray();
    Arrays.sort(cs);
    int n = numOccurrencesRequired - 1;
    for (int i = n; i < cs.length; ++i) {
      boolean allSame = true;
      for (int j = 1; j <= n && allSame; ++j) {
        allSame = cs[i] == cs[i - j];
      }
      if (allSame) return true;
    }
    return false;
    

    这会将所有相同的字符排序在一起,允许您在查找相邻的相等字符时只传递字符串

    请注意,这对任何符号都不起作用:它将分割多个字符码点,如🍕. 您可以调整上面的代码以使用代码点,而不是字符

  3. # 3 楼答案

    是的,这样的正则表达式存在,只是因为字符集是有限的

    regex: .*(a.*a|b.*b|c.*c|...|y.*y|z.*z).*
    

    这毫无意义。使用另一种方法:

    String string = "something";
    int[] count = new int[256];
    for (int i = 0; i < string.length; i++) {
        int temp = int(string.charAt(i));
        count[temp]++;
    }
    

    现在你已经计算了所有的字符,你可以随心所欲地使用它们