【问题标题】:How to express the following regex expression?如何表达下面的正则表达式?
【发布时间】:2017-11-01 16:46:57
【问题描述】:

我不擅长正则表达式,以下是要求。 我将把它与 Joi 验证器一起使用。

身份证:

  • 应该是字母数字
  • 除短划线和下划线(- 和 _)外,不能有任何特殊字符
  • 不能有 - 或 _ 连续(例如:this-id 可以,但 this--id 不行。

姓名:

  • 应该是字母数字
  • 不能有任何特殊字符,除了破折号和下划线(- 和 _),但允许空格。
  • 不能有 - 或 _ 连续(例如:this-id 可以,但 this--id 不行。

【问题讨论】:

标签: javascript regex joi


【解决方案1】:

ID 的正则表达式:

^[-_]?(?:[A-Za-z0-9]+[-_]?)+$
  • [-_]? 也允许下划线或连字符出现在开头
  • [A-Za-z0-9]+ 匹配一个或多个字母数字字符
  • [-_]? 允许零个或一个连字符或下划线
  • 整个模式被一个非捕获组和+包围,表示它可能重复一次或多次

这样可以确保没有 2 个连字符或下划线连续出现

Regex101 Demo

名称的正则表达式:

^[-_]?(?:[A-Za-z0-9 ]+[-_]?)+$

编辑:改进以修复开头出现的下划线或连字符。感谢@ErikBrodyDreyer 的收获! :)

【讨论】:

  • 如果 ID 以连字符或下划线开头的情况也需要接受,则不匹配。
  • @ErikBrodyDreyer 好点,错过了。可以通过在开头添加[-_]? 来修复,在非捕获组之外
【解决方案2】:

([a-zA-Z0-9]*(_)?(?!\2)(\-)?(?!\3))+

这将完成工作 它也会匹配 -_ 前缀

【讨论】:

    【解决方案3】:

    ID:^(?!.*([_-])\1)[\w-]+$

    姓名: ^(?!.*([_-])\1)[\w -]+$

    \w[A-Za-z0-9_] 相同,因此包含下划线。

    (?!.*([_-])\1) 是一个负前瞻,不允许在字符串 ^ 的开头后出现双破折号或双下划线。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多