【问题标题】:Regular expression for first name with some conditions带有某些条件的名字的正则表达式
【发布时间】:2015-06-08 06:57:12
【问题描述】:

我需要一个用于名的 JavaScript 正则表达式,并满足以下要求:

  1. 没有数字且以下字符无效:~`?(!^*¨ˆ;@=$%{}[]|\/<>#“.,
  2. 不应超过 3 个字
  3. 前面或后面没有空格
  4. 至少 2 个字符

我用两个独立的正则表达式做到了: 第一个是:对于没有数字和无效字符:

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

第二个不超过3个字:

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

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

【问题讨论】:

  • 那么,name 是否只包含字母?请提供所有允许的字符列表
  • ^[A-Z]([A-Za-z])+(\s[A-Za-z]{2,}){0,2}$ 还不够吗?
  • @Amit 我认为至少 2 个字符是总数,而不是每个单词...
  • @Mahesh:请提供样本有效和无效输入。
  • 是的,总共至少 2 个字符。

标签: javascript regex


【解决方案1】:

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

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

demo

解释

  • ^ - 在开头锚定字符串
  • (?=(?:[^A-Za-z]*[A-Za-z]){2}) - 一个积极的前瞻,检查我们是否在字符串中至少有 2 个英文字符
  • (?![^\d~``?!^*¨ˆ;@=$%{}\[\]|\\\/&lt;&gt;#“.,]*[\d~``?!^*¨ˆ;@=$%{}\[\]|\\\/&lt;&gt;#“.,]) - 否定前瞻检查是否没有禁止字符(根据 principle of contrast 优化)(无法正确格式化,必须加倍“`”符号)
  • \S{2,} - 至少包含 2 个字符的单词(非空白序列)
  • (?: \S+){0,2} - 2 个单词,至少包含 1 个字符
  • $ - 字符串结束。

【讨论】:

  • 全名最少 2 个字符。所以它可能是 AB,A B。
  • 好的,我将{0,2} 替换为+。现在,它应该接受AB A B
  • 我认为 \S{2, } 不符合要求。全名至少应包含两个字符。例如全名 = A B
  • 其他例子:全名 = A B C 全名 = Mack Rogger Shane 全名 = A Mack C 全名 = A B Mack 全名 = John B C 全名 = John Mack C
  • 请检查更新,我添加了至少 2 个英文字母的检查。 Demo here.
【解决方案2】:

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

[^0123456789]

然后做这样的事情:

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

[^0123456789]{2,}

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

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

【讨论】:

  • 您可以使用[^0-9],您不必指定每个字符。使用范围。另外我会加入白名单而不是黑名单:[a-z\-]。最终应该是这样的:/[a-z\-]{2,}(\s[a-z\-]{2,})?\s[a-z\-]{2,})?)/i
  • 我故意使用这种形式,因为@Mahesh 定义了他不想使用的字符
【解决方案3】:

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

name.match(/^([a-zA-Z]|\s)$/)

第二个条件你可以写name.split(/\s+/).length &lt;= 3

第三个就是name.trim()

第四个是你自己想出来的,name.length &gt;= 2

所以把它们放在一起:

var name = "    JOe      John   Thomas  ";
name = name.trim();
if (name.match(/^([a-zA-Z]|\s)$/) && name.split(/\s+/).length <= 3 && name.length >=2) {
  console.log("name is valid!");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    相关资源
    最近更新 更多