【问题标题】:Javascript Regex - must starts with letters can only have one occurrence of special characterJavascript Regex - 必须以字母开头,只能出现一次特殊字符
【发布时间】:2017-07-27 20:15:55
【问题描述】:

我是正则表达式的新手,并尝试根据以下特定要求创建一个:

  1. 必须以字母 a-Z 或 A-Z 开头
  2. 可以包含数字 0-9
  3. 只能包含允许的特殊字符,即@.-'
  4. 上述特殊字符只允许出现一次,即 test9@my.com 或 new-test10@me.com 有效,但 test5@new@com 无效

我尝试了以下代码,但无法满足所有要求 -

var myregex = /^([a-zA-Z0-9@.\-'])*$/;
if(!myregex.test(userIdVal)){
    alert('invalid');
}

感谢任何帮助。

【问题讨论】:

  • 不尝试验证电子邮件地址。这是对用户名的自定义验证。我已经使用 JQuery 验证框架进行电子邮件验证。
  • 如果您只想允许每个特殊字符 [@'.-] 一次,请尝试在前瞻内捕获并检查对捕获的一个的反向引用:/^[a-z](?!.*?([@'.-]).*?\1)[a-z\d@'.-]*$/i

标签: javascript regex find-occurrences


【解决方案1】:

我认为这行得通,只是在其他之间夹一个特别的。

^(?=[a-zA-Z])[a-zA-Z0-9]*[@.'-]?[a-zA-Z0-9]*$

解释

 ^ 
 (?= [a-zA-Z] )        # A char is in this string and starts with
 [a-zA-Z0-9]*          # Optional alnums
 [@.'-]?               # Optional single special
 [a-zA-Z0-9]*          # Optional alnums
 $

【讨论】:

    【解决方案2】:

    我建议在检查 @.-' 字符是否只使用一次时取消正则表达式:

    var myregex, specialCharOccurrences, i, key;
    
    // Test to see that only the allowed characters are used
    myregex = /^([a-zA-Z0-9@.\-'])*$/;
    if(!myregex.test(userIdVal)){
        alert('invalid');
    
    // Test for multiple occurrences of the special characters
    // a) create object in which the number of occurrences of the special characters are stored
    specialCharOccurrences = {
        "@": 0,
        ".": 0,
        "-": 0,
        "'": 0
    };
    
    // b) count the number of occurrences. If the # is greater than 1, send an alert.
    for (i = 0; i < userIdVal.length; i++) {
        if (/[@.\-']/.test(userIdVal[i])) specialCharOccurrences[userIdVal[i]]++;
        if (specialCharOccurrences[userIdVal[i]] > 1) alert("invalid");
    }
    

    【讨论】:

    • 这不仅不会验证 3 个需求的输入,只有 2 个,而且您将 2 个需求拆分为 1 +(字符串长度)正则表达式。对于非正则表达式解决方案,这不过是几个正则表达式。非常缓慢且难以阅读,带有循环和计数器。同时,它可以通过单行正则表达式测试来完成......
    【解决方案3】:

    试试这个:var myregex = /^[a-zA-Z]+[a-zA-Z\d]*[@\.-][a-zA-Z\d]*$/
    它可能看起来不太整洁,但嘿,它是一个正则表达式:>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多