【问题标题】:Regex - maximum 255 chars, no space at start and end,正则表达式 - 最多 255 个字符,开头和结尾没有空格,
【发布时间】:2017-09-07 20:52:20
【问题描述】:

我正在尝试为仅应包含有效文件夹名称的 html5 输入创建正则表达式。

为了支持多种文件系统,我考虑过只允许:

  1. a-Z 和 0-9 之间的最小长度为 1 个字符
  2. 中间允许空格,但开头或结尾不允许空格
  3. 最多允许 255 个字符

现在我的正则表达式看起来像这样:

[a-zA-Z0-9][a-zA-Z0-9 ]{0,254}[a-zA-Z0-9]?

最后的问号是个问题,因为如果没有给出结束字符,那将允许最后有空格。

但是,如果我忽略它,我需要添加至少 2 个字符。 如果我将? 添加到第一个模式,则会出现类似的问题。

现在我被困住了。我可以在没有 255 字符限制的情况下做到这一点,但有了它,一切都崩溃了。

【问题讨论】:

  • 为什么不在() 中将中间组和尾组一起括起来,并用? 使其成为可选,那么第一组始终是必需的,而最后一组只需要与中间组一起使用。
  • 啊,这么近,又这么远 :) - 还需要 {0, 253} 才能永远不超过 255 个字符,对吧? (或者我的数学也坏了?)
  • 正确答案是[a-zA-Z0-9](?:[a-zA-Z0-9 ]{0,253}[a-zA-Z0-9])?:HTML5 属性在幕后自动锚定模式,? 量词应应用于原始正则表达式中的第 2 和第 3 个原子组。

标签: javascript regex html


【解决方案1】:
/^\b[A-Z\d ]{1,255}\b$/i

HTML5 输入检查:pattern="\b[A-Za-z\d ]{1,255}\b"

【讨论】:

  • 不确定/i 的用途,但确实非常优雅!
  • \b++的出色运用值得被接受的答案
  • /i 是使匹配不区分大小写(消除了[A-Za-z] 类型语法的需要)
【解决方案2】:

您需要在开头添加 ^ 并在结尾添加 $,这样您的正则表达式才需要匹配整个测试行。否则它可以匹配 100000 个字符中的 255 个字符,它仍然会通过。

【讨论】:

  • 这个答案在 OP 使用的 HTML5 pattern 属性的上下文中是不正确的。无需在模式中显式使用^$,它们会在字符串模式传递给RegExp 构造函数时自动添加。
【解决方案3】:

您可以将此正则表达式与负前瞻一起使用:

^[a-zA-Z0-9](?!.* $)[a-zA-Z0-9 ]{0,254}$

RegEx Demo

正则表达式详细信息:

  • ^:开始
  • [a-zA-Z0-9]:匹配开头的字母数字字符
  • (?!.* $):当最后一个字符是空格时,否定前瞻断言失败
  • [a-zA-Z0-9 ]{0,254}:匹配 0 到 254 字母数字或空格字符
  • $:结束

【讨论】:

    【解决方案4】:

    你可以使用

    ^[a-zA-Z0-9]$|^[a-zA-Z0-9][a-zA-Z0-9 ]{0,253}[a-zA-Z0-9]$
    

    第一个选项处理单个字符大小写,第二部分处理 2-255 个字符大小写。

    【讨论】:

    • ^[a-zA-Z0-9]$|^[a-zA-Z0-9][a-zA-Z0-9 ]{0,253}[a-zA-Z0-9]$ 这样,还是? :)
    • 不需要在模式中显式使用^$,它们会在字符串模式传递给RegExp构造函数时自动添加。
    猜你喜欢
    • 2023-03-03
    • 2018-08-14
    • 2021-07-07
    • 2021-07-04
    • 2013-08-04
    • 2021-09-01
    相关资源
    最近更新 更多