正则表达式:区分下划线(_)和短划线( - )
问题描述:
我想构造一个模式来标识有效的域名。有效的域名中包含字母数字字符和破折号。唯一的规则是该名称不应以破折号开始或结束。正则表达式:区分下划线(_)和短划线( - )
我对审定^\w((\w|-)*\w)?$
正则表达式但是,表达式验证用下划线琴弦太(为前:cake_centre),这是错误的。谁能告诉我为什么会发生这种情况,以及如何纠正?
P.S .:我在PHP中使用preg_match()函数来检查验证。
答
元字符\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?)
答
下划线正在验证中,因为它们是\w
字符类的一部分。如果要排除它,尝试:
/^[a-z0-9]+[a-z0-9\-]*[a-z0-9]+$/i
答
这里是环视方法的正则表达式
(?<!-)([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
http://www.regular-expressions.info/shorthand.html –
已经解决了,一个念头使用['\ b'](http://www.regular-expressions.info/wordboundaries.html)获取更短的模式:['/^\ b [az \ d - ] + \ b $/i'] (https://regex101.com/r/2OVSlz/1) –