正则表达式:区分下划线(_)和短划线( - )

时间:2017-07-29 15:03:25

标签: php regex validation

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

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

然而,表达式也是用下划线验证字符串(例如:cake_centre),这是错误的。任何人都可以告诉我为什么会发生这种情况以及如何纠正它?

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

3 个答案:

答案 0 :(得分:4)

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

[a-zA-Z\d-]

或根据你的正则表达式:

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

(另请注意,字符类中的-位置很重要,开头或结尾的-是文字值。如果你在中间有它,则可以创建一个范围。{ {3}})

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

 (?<!-)([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