2017-07-29 141 views
2

我想构造一个模式来标识有效的域名。有效的域名中包含字母数字字符和破折号。唯一的规则是该名称不应以破折号开始或结束。正则表达式:区分下划线(_)和短划线( - )

我对审定^\w((\w|-)*\w)?$

正则表达式但是,表达式验证用下划线​​琴弦太(为前:cake_centre),这是错误的。谁能告诉我为什么会发生这种情况,以及如何纠正?

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

+0

http://www.regular-expressions.info/shorthand.html –

+0

已经解决了,一个念头使用['\ b'](http://www.regular-expressions.info/wordboundaries.html)获取更短的模式:['/^\ b [az \ d - ] + \ b $/i'] (https://regex101.com/r/2OVSlz/1) –

回答

4

元字符\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?

0

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

/^[a-z0-9]+[a-z0-9\-]*[a-z0-9]+$/i 
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 
相关问题