我正在寻找将检测字符串中的重复符号的正则表达式.目前我找不到符合我所有要求的解决方案.
要求非常简单:
需要检测的示例(符号'a',超过2次,如果检测到则为true,否则为false)
"Abcdefg" - 错误
"AbcdaBCD" - 假
"abcd_ab_ab" - true(符号'a'使用了三次)
"aabbaabb" - 真(符号'a'使用了四次)
由于我不是正则表达式的专业人士和使用它们 - 代码片段和解释将不胜感激!
谢谢!
我觉得
(.).*\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)
这会将所有相同的字符排序在一起,只需在查找相邻的相等字符时传递字符串即可.
请注意,这并不十分适用于任何符号:它会分裂像多字符码点.您可以调整上面的代码来使用代码点,而不是字符.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |