【问题标题】:Java's regex - String matches - not-repeating and not incremential [closed]Java 正则表达式 - 字符串匹配 - 不重复且不增量 [关闭]
【发布时间】:2013-07-29 23:43:48
【问题描述】:

我想拒绝包含最少 4 个字符、最多 39 个字符、包含 a-z、A-Z、0-9、-、_、@ 和 的用户名或密码字符串。并且字符应该是不重复和不递增的,例如“aaaa”或“1234”或“abcd”以及 URL (HTTP-POST) 友好。

我一直在尝试调查String.matches()

这部分最少 4 个字符,最多 39 个字符,包含 a-z、A-Z、0-9 似乎并不难,但有没有办法在符合所有这些要求的匹配项上测试字符串?

【问题讨论】:

  • 我建议使用正则表达式来验证长度和允许的字符,然后使用自定义 Java 函数扫描重复或递增字符,如果输入通过正则表达式。正则表达式无法识别递增字符,除非列出所有可能的带有递增字符的字符串。
  • “URL (HTTP-POST) 友好”是什么意思?这不只是基于您已经列出的允许的字符吗?无论如何,最好不要基于 URL 友好性来限制用户名,而是在生成 URL 之前调用 URL 编码函数(将特殊字符更改为 %xx 等实体),并在解释时调用 URL 解码函数网址。
  • 你不能做那种非增量的事情。正则表达式不适合。

标签: android regex string character


【解决方案1】:

我会分别验证所有这些内容。这将使所有验证更简单、更易于理解和维护。

另外,您将知道违反了哪个约束,因此您可以向用户报告更准确的错误(例如,“密码太短”而不是“您的密码应该验证以下约束:....”)

  • 长度:使用String.length()
  • 允许的字符:使用正则表达式:"^[a-zA-Z0-9_@\\.-]*$"
  • 非重复和非增量:正则表达式不是为了那个。正如评论中提到的,我会进行自定义验证(迭代输入字符,检测字符的常量和递增序列)。类似的东西应该可以工作:

    public boolean isBad(String test) {
        int repeating = 0;
        int incremental = 0;
        for (int i = 1; i < test.length(); ++i) {
            char prev = test.charAt(i - 1);
            char curr = test.charAt(i);
            if (prev == curr) {
                repeating++;
            } else {
                repeating = 0;
            }
            if (curr - prev == 1) {
                incremental++;
            } else {
                incremental = 0;
            }
            if (repeating == 3) {
                System.out.println("too many repeated " + curr);
                return true;
            }
            if(incremental==3){
                System.out.println("incrementing sequence");
                return true;
            }
        }
        return false;
    }
    
  • url-friendly:您对字符集(字母数字和几个符号)设置的限制应该足够了

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多