2010-04-23 213 views
2

我有一些代码验证1到32个字符的字符串,它可能只包含字母数字和连字符(' - '),但不能以连字符开头或结尾。如何正则表达式匹配一串alnums和连字符,但不以连字符开头或结尾?

我使用PCRE正则表达式& PHP(尽管PHP部分在这种情况下并不重要)。

眼下的伪代码如下所示:

if (match("/^[\p{L}0-9][\p{L}0-9-]{0,31}$/u", string) 
    and 
    not match("/-$/", string)) 

    print "success!" 

也就是说,我首先检查该字符串是正确的内容,不与被“ - ”,是的正确的长度,然后我正在运行另一个测试,看看它不以' - '结尾。

有关将此合并到单个PCRE正则表达式的建议吗?

我试过使用预见/后视断言,但无法让它工作。

回答

2

试试这个正则表达式:

/^[\p{L}0-9](?:[\p{L}0-9-]{0,30}[\p{L}0-9])?$/u 

如果你想使用环视断言:

/^[\p{L}0-9][\p{L}0-9-]{0,31}$(?<!-)/u 
+0

第一个建议很好,似乎通过了我所有的测试,谢谢! 顺便说一句,你知道是否有任何理由相对于另一方偏好吗? – shevron 2010-04-23 18:19:54

+0

@Shahar Evron:有正则表达式实现,根本不支持隐藏断言或环视断言。在那种情况下,知道替代方案是很好的。 – Gumbo 2010-04-24 00:17:22

1

稍微另一种办法是让你的角色类为一体,并具体说明您不想允许连字符的点。

/^(?!-)[\p{L}0-9-]{1,32}(?<!-)$/Du 

还要注意D修改,每个人都似乎总是忘记。

最后,可以肯定的是,您知道\pL将比a-zA-Z匹配得多,对不对?只是检查。

+0

是的,我意识到这一点,这就是为什么我使用它:) – shevron 2010-04-29 06:48:06

相关问题