我正在寻找将检测String中重复符号的正则表达式。目前我找不到符合我所有要求的解决方案。
要求非常简单:
所需检测的示例(符号'a',超过2次,如果检测到则为true,否则为false)
“Abcdefg” - false
“AbcdaBCD” - false
“abcd_ab_ab” - true (符号'a'使用了三次)
“aabbaabb” - true (符号'a'使用了四次)
由于我不是正则表达式的专业人士并且使用它们 - 代码段和解释将不胜感激!
谢谢!
答案 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]++;
}
现在您已经计算了所有字符,您可以根据需要使用它们。