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

Dem*_*god -1 java regex

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

要求非常简单:

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

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

"Abcdefg" - 错误

"AbcdaBCD" -

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

"aabbaabb" - (符号'a'使用了四次)

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

谢谢!

And*_*ner 6

我觉得

(.).*\1
Run Code Online (Sandbox Code Playgroud)

会工作:

  • (.) 匹配单个字符并捕获
  • .* 匹配任何介入的角色
  • \1 再次匹配捕获的组.

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

如果你想要求它至少发现3次,只需改变后两个子弹的量词:

(.)(.*\1){2}
Run Code Online (Sandbox Code Playgroud)

等等

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

你也可以不使用正则表达式,例如

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;
Run Code Online (Sandbox Code Playgroud)

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

请注意,这并不十分适用于任何符号:它会分裂像多字符码点.您可以调整上面的代码来使用代码点,而不是字符.

  • @xenteros在https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html - "`\n`看看"后向引用" - 无论第n个捕获组是什么匹配" (2认同)