正则表达式以检测字符是否重复了三遍以上

时间:2018-10-10 14:30:51

标签: java regex kotlin

我尝试遵循此处描述的解决方案:https://stackoverflow.com/a/17973873/2149915 尝试匹配具有以下要求的字符串: -字符串中顺序重复的3个以上字符应匹配并返回。

示例:

  • 你好吗...->有效
  • 你好,你好.............->无效
  • hiii->有效
  • hiiiiii->无效

依此类推,以此类推,目的是检测无意义的文本。

到目前为止,我的解决方案是按原样修改链接中的正则表达式。

原始:^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$

已自适应:^(?!.*([A-Za-z0-9\.\,\/\|\\])\1{3})$

从本质上讲,我删除了捕获数字和字母数字的组的要求:(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+,并尝试添加额外的字符检测功能,例如./,\等,但似乎根本不与任何字符匹配...

关于我如何实现这一目标的任何想法?

提前谢谢:)

编辑: 我在这个问题https://stackoverflow.com/a/44659071/2149915上找到了这个正则表达式:^.*(\S)(?: ?\1){9,}.*$,并对其进行了修改,使其仅可匹配3个字符,例如^.*(\S)(?: ?\1){3}.*$

现在它可以检测到以下情况:

  • aaaa->无效
  • 你好.........->无效
  • ///// ....->无效

但是它不考虑这样的空格:

  • . . . . .

是否可以进行修改以实现此目的?

1 个答案:

答案 0 :(得分:2)

如果您要查找重复超过3次的任何字符,我认为有一个更简单的解决方案:

String[] inputs = {
    "hello how are you...", // -> VALID
    "hello how are you.............", // -> INVALID
    "hiii", // -> VALID
    "hiiiiii" // -> INVALID
};
//                            | group 1 - any character
//                            | | back-reference
//                            | |   | 4+ quantifier including previous instance
//                            | |   |     | dot represents any character, 
//                            | |   |     | including whitespace and line feeds
//                            | |   |     | 
Pattern p = Pattern.compile("(.)\\1{3,}", Pattern.DOTALL);
// iterating test inputs
for (String s: inputs) {
    // matching
    Matcher m = p.matcher(s);
    // 4+ repeated character found
    if (m.find()) {
        System.out.printf(
            "Input '%s' not valid, character '%s' repeated more than 3 times%n", 
            s, 
            m.group(1)
        );
    }
}

输出

Input 'hello how are you............. not valid', character '.' repeated more than 3 times
Input 'hiiiiii' not valid, character 'i' repeated more than 3 times
Input 'hello    how are you' not valid, character ' ' repeated more than 3 times