【问题标题】:Regex: Differentiating underscore(_) and dash(-)正则表达式:区分下划线(_)和破折号(-)
【发布时间】:2017-07-29 15:03:24
【问题描述】:

我想构造一个识别有效域名的模式。有效的域名包含字母数字字符和破折号。唯一的规则是名称不应以破折号开头或结尾。

我有一个用于验证的正则表达式^\w((\w|-)*\w)?$

但是,该表达式也在验证带有下划线的字符串(例如:cake_centre),这是错误的。谁能告诉我为什么会发生这种情况以及如何纠正它?

P.S.:我在 PHP 中使用 preg_match() 函数来检查验证。

【问题讨论】:

标签: php regex validation


【解决方案1】:

元字符\w 包含下划线,您可以创建一个字符类来满足您列出的要求:

[a-zA-Z\d-]

或根据您的正则表达式:

^[a-zA-Z\d]([a-zA-Z\d-]*[a-zA-Z\d])?$

(还要注意字符类中的- 位置很重要,开头或结尾的- 是文字值。如果你在中间有它可以创建一个范围。What special characters must be escaped in regular expressions?

【讨论】:

    【解决方案2】:

    正在验证下划线,因为它们是\w 字符类的一部分。如果要排除它,请尝试:

    /^[a-z0-9]+[a-z0-9\-]*[a-z0-9]+$/i
    

    【讨论】:

      【解决方案3】:

      这是带有环视方法的正则表达式

       (?<!-)([a-zA-Z0-9_]+)(?!-)
      
      regexp pattern is created in 3 groups
      
      First group ^(?<!-) is negetive look back to ensure that matched chars does not have dash before
      
      Second group ([a-zA-Z0-9_]+) give matching characters
      
      Third group (?!-) is negetive lookahead to ensure match is not ending with dash 
      

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多