【问题标题】:Can someone help me to convert this regex expression written in C# to javascript?有人可以帮我将这个用 C# 编写的正则表达式转换为 javascript 吗?
【发布时间】:2012-09-23 07:51:18
【问题描述】:

我必须对文本框中的文本进行一些模式匹配。我在 C# 服务器的回发事件中这样做。 我的正则表达式如下:

 public bool ValidatePassword(string temp)
    {
        bool isMatch = false;
        passwd = passwd.Trim();

        isMatch = Regex.IsMatch(temp,
                             @"^           # Start of string
                        (?=.*\p{Lu})      # Assert at least one uppercase letter
                        (?=.*\p{Ll})      # Assert at least one lowercase letter
                        (?=.*\d)          # Assert at least one digit
                        (?=.*[^\p{L}\d])  # Assert at least one other character
                        .{8,13}           # Match at least 8 characters and maximum of 13 characters
                        $                 # End of string",
                             RegexOptions.IgnorePatternWhitespace);


        return isMatch;
    }

我想将其移至 Javascript,以便在客户端进行匹配。有人可以帮我把这个函数移到 Javascript 上吗?

【问题讨论】:

  • 这个link 可以帮助你。
  • \p{Lu} 也将匹配 Unicode 字符的大写。模仿这种行为是可能的,但有点笨拙。

标签: c# javascript html regex client-side


【解决方案1】:

类似:

function ValidatePassword(temp) {
  return /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^a-zA-Z\d]).{8,13}$/.test(temp);
}

【讨论】:

    【解决方案2】:

    JavaScript 正则表达式实现只理解拉丁字符的大小写,它没有实现国家字符语义,所以很遗憾,没有办法翻译这个正则表达式,甚至在任何接近原点的地方都没有......

    如果您将此作为学习练习,那么,也许您可​​以看一下正则表达式的 Perl 实现并拥有一份副本。但是,如果您的问题更多地涉及实际领域,那么请考虑您的目标受众以及他们可能输入的语言,查找其字符集中的小写/大写字母的 Unicode 代码点并采取相应的行动。另请注意,许多非拉丁语言没有字母大小写的概念。

    或者,也许,考虑更严格的密码规则。 :)

    【讨论】:

    • +1 表示不盲目提供答案。实际上,有一种方法可以打印出某个组的所有 C# 代码点,然后我们可以编写代码来生成替换字符组。
    • 如果要对密码进行哈希处理,那么我认为这些字符很好,甚至可能比仅限于英文字母更好。
    • 不,我不知道。我知道网页在密码中接受 Unicode 字符的一个实例(不确定服务器在什么上运行)。我的观点是,我更喜欢让人们输入 Unicode 字符来扩展暴力破解的范围
    【解决方案3】:

    在 Javascript 中匹配大小写字母并不容易,因为它不支持 \p{…} 字符类。我建议您在正则表达式之外进行测试。此外,“其他字符”很难定义,只是[^a-z0-9],还是没有变音符号等?顺便说一句,您应该强制使用更长的密码而不是更神秘的密码。

    function validatePassword(temp) {
        // temp = temp.trim() - is not supported in all browsers or needs to be shimmed
        //                      will be done in the regex
    
        if (temp.toUpperCase() == temp) // no lowercase char
            return false;
        if (temp.toLowerCase() == temp) // no uppercase char
            return false;
    
        return temp.test(/^\s*(?=.*\d).{8,13}\s*$/);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多