【问题标题】:HTML5 Regex Pattern: Allow alphanumeric and up to 3 spaces, underscores, and hyphensHTML5 正则表达式模式:允许字母数字和最多 3 个空格、下划线和连字符
【发布时间】:2013-02-01 14:57:43
【问题描述】:
^[a-zA-Z0-9]*[a-zA-Z0-9 _][a-zA-Z0-9]{2,24}$

这就是我现在所拥有的。

我想先要求一个字母数字;允许使用字母数字、下划线、连字符、句点和空格;要求它以字母数字结尾。但我只想允许最多 3 个这些特殊字符。

我主要对如何限制特殊字符的数量感到困惑。

【问题讨论】:

  • 举一些有效和无效数据的例子
  • 如果您允许多达 3 个特殊字符,它们必须连续还是总共 3 个?那么像 A-B-A 这样的东西有效吗?
  • 共 3 个。它们可以是连续的或分散的。他们只是无法开始或结束字符串。

标签: regex html


【解决方案1】:

你也可以使用这个正则表达式:

/^(?!(?:[a-z\d]*[_. -]){4})[a-z\d][\w. -]{0,22}[a-z\d]$/i

前瞻(?!(?:[a-z\d]*[_. -]){4}) 用于检查出现的无效字符是否少于 4 次。如果有 4 个或更多,则负前瞻内的模式将匹配,并使前瞻失败。

由于字符串必须以字母数字开头和结尾,并且长度至少为 2,因此可以指定 [a-z\d] 作为字符串的开头和结尾。中间的其余字符可以包含重复 0 到 22 次的 [a-zA-Z0-9_. -] 中的任何一个,因为 2 个字符已经用于开头的字母数字。

【讨论】:

  • 嗯,我从未在负前瞻中看到过前瞻。这很漂亮。 ?:?= 有什么区别?
  • 如此接近。据我所知,您的解决方案的唯一问题是 HTML5 的正则表达式检查器区分大小写并且不响应 /i 标志。因此有必要将其删除并手动将大写字母指定为有效。这意味着模式应该是^(?!(?:[a-zA-Z\d]*[_. -]){4})[a-zA-Z\d][\w. -]{2,22}[a-zA-Z\d]$ 谢谢,nhahtdh。
  • @iamnotmaynard:这不是负前瞻中的前瞻。这只是一个消极的前瞻(?!pattern),一个非捕获组(?:pattern)重复4次。
  • 出于某种原因,我对此并不熟悉。谢谢你教我一些东西。
【解决方案2】:

好的,这应该是最后一次编辑:没有考虑总字符数限制。添加了前瞻(假设您的正则表达式支持它)。

可能有比这更好的方法,但它不会来找我(也许使用前瞻)。以下是我能想到的:

^(?=^.{2,24}$)[a-zA-Z0-9]+([a-zA-Z0-9]*[_\-. ]){0,3}[a-zA-Z0-9]+$

它不太漂亮,但应该可以。

【讨论】:

  • 可以简化为^[a-zA-Z0-9]+(([a-zA-Z0-9]*[_\-. ]){0,3}[a-zA-Z0-9]+)?$,可以单独做长度检查。
  • True,如果需要(或首选样式或只是为了防止正则表达式变得混乱)。
【解决方案3】:
^[a-zA-Z0-9]+[ _.-]?[a-zA-Z0-9]*[ _.-]?[a-zA-Z0-9]*[ _.-]?[a-zA-Z0-9]+$

可能有更好的方法来做到这一点,但我认为你可以让无效字符是可选的,最多出现 3 次,而其他有效字符在它们之间出现 0 次或更多次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2022-01-14
    相关资源
    最近更新 更多