【问题标题】:javascript regex (username validation)javascript 正则表达式(用户名验证)
【发布时间】:2022-01-29 01:09:28
【问题描述】:

我想强制执行

  1. 输入的名字只能包含字符 A-Z、a-z 和 -
  2. 输入的登录名只能包含字母数字字符

如何在javascript中限制这两条规则?

下面是我的用户名正则表达式代码 (jsp)。但它不能正常工作。

function validateForm(){
    var nameRegex = /^[a-zA-Z\-]+$/;
    var validfirstUsername = document.frm.firstName.value.match(nameRegex);
    if(validUsername == null){
        alert("Your first name is not valid. Only characters A-Z, a-z and '-' are  acceptable.");
        document.frm.firstName.focus();
        return false;
    }
}

谢谢!

【问题讨论】:

  • 用户名登录有什么区别?此外,您所拥有的有什么问题(除了不一致的命名)?
  • @JasonMcCreary 一个是名字,另一个是登录名。使用上面的代码,如果我使用 horatio2m 作为名字输入,用户仍然可以被保存,这不是我想要的。我想验证名字输入应该只包含 a-z、A-Z 和 -
  • if(validUsername == null){ 替换为if(validfirstUsername == null){
  • @JoshPurvis 是的,你是对的。一个愚蠢的错误。谢谢。
  • 这里真正的问题是用户可以简单地关闭javascript并提交他们想要的任何用户名。请在后端也验证这一点。

标签: javascript regex


【解决方案1】:

除了变量引用不一致(参见 Josh Purvis 的评论)之外,您的代码看起来还不错。

以下正则表达式适用于您的名字规范:

var nameRegex = /^[a-zA-Z\-]+$/;

为您的用户名检查添加数字很简单:

var usernameRegex = /^[a-zA-Z0-9]+$/;

注意:编写正则表达式的方法有很多种。我已选择提供与您开始使用的版本相匹配的版本。我鼓励你完成这个Regular Expression Tutorial

【讨论】:

  • 我可以使用 /[a-zA-Z\-]/ 代替 /^[a-zA-Z\-]+$/ 吗?为什么我们需要在 [a-zA-Z\-] 前面使用 ^?
  • ^ 表示匹配字符串中的起始位置
  • ^ 表示字符串的开头。 $ 表示结束。例如,如果您省略了^~@*##@horatio 将通过您的验证。 $ 和正在检查的字符串的结尾也是如此。
  • 我想指出,这允许 12345 作为有效用户名传递。您如何确保至少有一封信?
【解决方案2】:

这是我想出的验证功能,为您自己的用例量身定制:

function isUserNameValid(username) {
  /* 
    Usernames can only have: 
    - Lowercase Letters (a-z) 
    - Numbers (0-9)
    - Dots (.)
    - Underscores (_)
  */
  const res = /^[a-z0-9_\.]+$/.exec(username);
  const valid = !!res;
  return valid;
}

【讨论】:

    【解决方案3】:

    用户名只能使用字母、数字、下划线和句点。

      const onValidUsername = (val) => {
        const usernameRegex = /^[a-z0-9_.]+$/
        return usernameRegex.test(val)
      }
    

    【讨论】: