【问题标题】:How to regex match a string of alnums and hyphens, but which doesn't begin or end with a hyphen?如何正则表达式匹配一串数字和连字符,但不以连字符开头或结尾?
【发布时间】:2011-02-11 15:10:55
【问题描述】:

我有一些代码验证 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!"

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

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

我尝试过使用前瞻/后瞻断言,但无法正常工作。

【问题讨论】:

    标签: php regex string pcre assertions


    【解决方案1】:

    试试这个正则表达式:

    /^[\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
    

    【讨论】:

    • 第一个建议很好,似乎通过了我所有的测试,谢谢!顺便说一句,您知道是否有任何理由偏爱其中一个?
    • @Shahar Evron:有些正则表达式实现根本不支持后视断言或环视断言。在这种情况下,最好知道一个替代方案。
    【解决方案2】:

    另一种方法是将您的字符类保持在一个整体中,并具体说明您不想使用连字符的点。

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

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

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

    【讨论】:

    • 是的,我知道,这就是我使用它的原因:)
    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2022-08-03
    • 2018-01-28
    • 2021-09-26
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多