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

时间:2016-09-28 10:14:32

标签: java regex

我正在寻找将检测String中重复符号的正则表达式。目前我找不到符合我所有要求的解决方案。

要求非常简单:

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

所需检测的示例(符号'a',超过2次,如果检测到则为true,否则为false)

“Abcdefg” - false

“AbcdaBCD” - false

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

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

由于我不是正则表达式的专业人士并且使用它们 - 代码段解释将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:6)

我认为

(.).*\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;

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

请注意,对于任何符号,这都不会完全:它会拆分多个字符代码点,例如。您可以调整上面的代码来处理代码点,而不是字符。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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]++;
}

现在您已经计算了所有字符,您可以根据需要使用它们。