我想构建一个标识有效域名的模式。有效的域名中包含字母数字字符和短划线。唯一的规则是名称不应以破折号开头或结尾。
我有一个正则表达式用于验证^\w((\w|-)*\w)?$
然而,表达式也是用下划线验证字符串(例如:cake_centre),这是错误的。任何人都可以告诉我为什么会发生这种情况以及如何纠正它?
P.S。:我在PHP中使用preg_match()函数来检查验证。
答案 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