具有某些条件的名字的正则表达式

时间:2015-06-08 06:57:12

标签: javascript regex

我需要一个带有以下要求的名字的JavaScript正则表达式:

  1. 没有数字和以下字符无效:~`?(!^*¨ˆ;@=$%{}[]|\/<>#“.,
  2. 不应超过3个字
  3. 没有先行或尾随空格
  4. 最少2个字符
  5. 我用两个单独的正则表达式做到了: 第一个是:没有数字和无效字符:

    ^[A-Za-z][^\d~`?!^*¨ˆ;@=$%{}\[\]\|\\\/<>#“.,]*$
    

    第二个不超过3个字:

    ^[A-Za-z]+( [A-Za-z]+){0,2}$
    

    我需要一个正则表达式来处理上述所有4个条件(或至少3个因为我们可以为第4个条件设置最小长度条件)。

3 个答案:

答案 0 :(得分:2)

这是一个符合您要求的正则表达式:

^(?=(?:[^A-Za-z]*[A-Za-z]){2})(?![^\d~`?!^*¨ˆ;@=$%{}\[\]|\\\/<>#“.,]*[\d~`?!^*¨ˆ;@=$%{}\[\]|\\\/<>#“.,])\S+(?: \S+){0,2}$

请参阅demo

<强>说明

  • ^ - 将字符串锚定在开头
  • (?=(?:[^A-Za-z]*[A-Za-z]){2}) - 正面预测,检查字符串中是否至少包含2个英文字符
  • (?![^\d~``?!^*¨ˆ;@=$%{}\[\]|\\\/<>#“.,]*[\d~``?!^*¨ˆ;@=$%{}\[\]|\\\/<>#“.,]) - 负面前瞻检查是否没有禁用字符(根据principle of contrast优化)(无法格式化,不得不加倍“”符号)
  • \S{2,} - 由至少2个字符组成的单词(非空白序列)
  • (?: \S+){0,2} - 包含至少1个字符的2个字
  • $ - 字符串结束。

答案 1 :(得分:0)

我认为你应该定义一组可用的字符。为简单起见假设:

[^0123456789]

并做这样的事情:

定义一个段的最小长度为2

[^0123456789]{2,}

构造只接受1-3个单词的正则表达式:

[^0123456789]{2,}(\s[^0123456789]{2,}(\s[^0123456789]{2,})?)?

答案 2 :(得分:0)

实际上你只需要第一个条件的RegExp。您基本上想要的是除了数字之外只有单词字符的名称,但仍然可能有空格:

[RegularExpression(@"([0-9A-Z]+[\s][0-9A-Z]+)", ErrorMessage="Invalid Card Holder Name")]
    public string NameOnCard
    {
        get
        {
            return m_strNameOnCard;
        }
        set
        {
            m_strNameOnCard = value;
        }
    }

对于第二个条件,您可以写name.match(/^([a-zA-Z]|\s)$/)

对于第三个,它只是name.split(/\s+/).length <= 3

第四个是你用name.trim()为自己解决的问题。

所以要把它们放在一起:

name.length >= 2