2

我有一些代码验证 1 到 32 个字符的字符串,它可能只包含字母数字和连字符 ('-'),但可能不以连字符开头或结尾。

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

现在伪代码看起来像这样:

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

   print "success!"

也就是说,我首先检查字符串的内容是否正确,不带有'-'并且长度正确,然后我正在运行另一个测试以查看它不以a结尾'-'。

关于将其合并为单个 PCRE 正则表达式的任何建议?

我试过使用前瞻/后瞻断言,但无法让它工作。

4

2 回答 2

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
于 2010-04-23T17:14:05.603 回答
1

一种稍微替代的方法是将您的角色类保持在一个整体中,并具体说明您不想允许连字符的点。

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

还要注意D每个人似乎总是忘记的修饰符。

最后,可以肯定的是,您知道\pL匹配的范围远不止a-zA-Z,对吗?只是检查。

于 2010-04-23T18:32:51.823 回答