在JavaScript字符串中使用的正则表达式,其数字不超过n个

时间:2016-08-31 05:51:10

标签: javascript regex

我正在尝试使用正则表达式在jquery中验证用户名,并遵循以下规则

  • 字符串必须以字母

  • 开头
  • 字符串可以有0(m)到4(n)位数或不超过4(n)

  • 字符串的大小必须介于6(p)和20(q)之间

以下应该失败

  • 1djgWWq(以数字开头)

  • wwwhg(长度小于6)

  • ky12yu781(超过4位数)

以下内容应通过

  • tableten

  • table10

  • tab7le10

我尝试使用正则表达式,但它在字符串

中的任何位置都不匹配4位数
^(?=^[A-Za-z]+[A-Za-z0-9_-]{5,20}$)(?=^(?:(?!\d{4}).)*$).*$

Sample regex101

注意:m,n,p,q整数变量

  

编辑1

Sebastian Proske>是字母数字和_ - 我想尝试使用不同的正则表达式为每个字段验证表单中的字段,因此每个字段的正则表达式,我想坚持使用一个正则表达式来获得更清晰的代码。 bellow是未经测试的示例代码,可以让您了解我正在尝试做什么。 Sebastian Proske的答案是我工作中最好的答案。谢谢大家。

Sample 1<input id="ds1" type="text" class="validate" data-validate='{"regex":"^[a-z0-9]{4,7}$"}' /><br/>
Sample 2...
Sample 3...
Active Sample <input id="as" type="text" class="validate" data-validate='{"regex":"^(?=^[A-Za-z]+[A-Za-z0-9_-]{5,20}$)(?=^(?:(?!\d{4}).)*$).*$"}' /><br/>
<input id="f1SubmitBtn" type="button" value="Test" onclick="f1Submit();" /><br/>
<script>
  function f1Submit() {
  $('.validate').each(function() {
    if (!$(this).data('validate').regex.test(this.value)) {
      console.log(this.value + " No!");
    }
  });  
</script>

3 个答案:

答案 0 :(得分:3)

从原始正则表达式中我假设_-也是允许的字符。您可以使用正则表达式/^(?!(?:\D*\d){5})[a-z][\w-]{5,19}$/i测试您的姓名。

稍微分解:

  • ^是字符串开头的锚点
  • (?!(?:\D*\d){5})是一个负向前瞻,检查是否存在5位数字(这会导致匹配失败)
  • [a-z]第一个字符必须是字母
  • [\w-]{5,19}长度介于6到20之间,允许使用单词字符([a-zA-Z0-9_])和减号
  • $是字符串结尾的锚点
  • i是不区分大小写的修饰符

请参阅Regex101

答案 1 :(得分:1)

我可以用两个正则表达式完成这个(我希望),并在结果之间做and

第一个是

^[a-zA-A][a-zA-Z0-9]{5,19}$

使字符串以字母开头,并将长度限制为6-20

,第二个是

^[^\d]*?(\d|\d[^\d]+){0,4}$

将位数限制为0-4

我相信你想要速度正则表达式,我认为在2个正则表达式结果之间做逻辑and也是可以接受的。

答案 2 :(得分:1)

您必须添加一些逻辑来实现您想要的行为:

<script>

    function matches(str, m, n, p, q) {

        var numDigits = str.replace(/[^0-9]/g, '').length;

        if(m <= numDigits && numDigits <= n) {
            return new RegExp('^[A-Za-z].{' + (p - 1) + ',' + (q - 1) + '}$').test(str);
        } else {
            return false;
        }
    }

    var tests = ['1djgWWq', 'wwwhg', 'ky12yu781', 'tableten', 'table10','tableten'];

    for(var i = 0; i < tests.length; i++) {
        console.log(tests[i] + ' -> ' + matches(tests[i], 0, 4, 6, 20));
    }

</script>

结果是:

1djgWWq -> false
wwwhg -> false
ky12yu781 -> false
tableten -> true
table10 -> true
tableten -> true

这里是jsfiddle:https://jsfiddle.net/z7a6fgfg/