【问题标题】:Regex begin and end with different conditions, but allow a single character正则表达式以不同的条件开始和结束,但允许单个字符
【发布时间】:2015-08-11 06:07:32
【问题描述】:

所以我坚持要正确使用这个正则表达式......这里是规则:

  • 必须以字母开头。
  • 它只能包含字母、数字、连字符和下划线。
  • 必须以字母或数字结尾。

我已经走到这一步了:

/\A^[A-Z]+[A-Z0-9\-_]*[A-Z0-9]$\z/i

这似乎可行,但不允许使用单个字母。所以a 会返回 false。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以使用这个基于前瞻的正则表达式来允许单个字符输入

    /^(?=.*?[A-Z0-9]$)[A-Z][\w-]*$/mgi
    

    RegEx Demo

    (?=.*?[A-Z0-9]$) 将强制执行字符串必须以字母或数字结尾的规则。

    【讨论】:

    • 非常感谢......我真的不会理解正则表达式 Lol......即使看了你的演示,我也看不出它是如何工作的......但至少它有效:D
    • 它与您使用的正则表达式基本相同,但我添加了一个重要的前瞻性变化。前瞻是(?=.*?[A-Z0-9]$),它表示只有在结束锚$ 之前有一个字母或数字时才匹配。
    • 本可以更简单、更优雅.. 前瞻功能强大但会降低性能..
    • Lookaheads 用于在正则表达式中强制执行规则。是的,这是一个更简单的情况,但有很多情况是无法避免的。
    【解决方案2】:

    由于[A-Z]+[A-Z0-9]$.. ,您的正则表达式至少需要两个字母。

    使用以下内容:

    \A^[A-Z](?:[A-Z0-9\-_]*[A-Z0-9])?$\z
            ^^^                     ^
    

    DEMO

    解释:

    • + 不是必需的,因为它被 [A-Z0-9\-_]* 覆盖
    • 将剩余的模式作为一个字符的可选(?)包含在一个字符中,但对于多个字符是强制性的..

    【讨论】:

      【解决方案3】:

      我会选择这样的替代方案:

      ^([A-Za-z]|[A-Za-z][\w-]*[A-Za-z0-9])$
      

      Demo is here

      第一个替代词是单个字母,第二个是字母后跟字母或数字或连字符 0 到无限次并以字母或数字结尾。括号构成一个捕获组,并强制替代在行的开始和结束之间 (^$)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多