【问题标题】:Regex to match bitmessage address正则表达式匹配位消息地址
【发布时间】:2014-11-01 06:18:14
【问题描述】:

我很难想出有效的正则表达式来查找文本字符串中所有出现的位消息地址。

位消息地址的一个例子是:BM-BcbRqcFFSQUUmXFKsPJgVQPSiFA3Xash

BM-部分后的有效字符为123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ(缺少I l O 0)

文档说“BM-”前缀后面的地址部分长度在 32-34 个字符之间。

我不确定这是否可以用正则表达式完成,我很难让它以特定的长度匹配,有效的 a-z 减去排除的字符。

如果这对正则表达式字符串有影响,我计划使用 PHP 实现正则表达式。

来源:

字符集:https://bitmessage.org/forum/index.php?topic=3255.0

地址长度:https://bitmessage.org/wiki/Address#Length

【问题讨论】:

  • 两个答案都很棒,谢谢 Avinash 和 Taco :) 我选择了 Avinash 的答案,因为它展示了排除字符的方法。

标签: php regex


【解决方案1】:

这可以通过正则表达式轻松实现,

^BM-(?:(?![IlO0])[A-Za-z0-9]){32,34}$

DEMO

(?:(?![IlO0])[A-Za-z0-9]){32,34} 告诉正则表达式引擎,匹配字母数字集 [A-Za-z0-9] 中的任何字符,IlO0 除外。并且字符长度必须在 32 到 34 之间。

如果此Bit消息地址位于行的中间或某部分,则删除开始和结束锚。

【讨论】:

    【解决方案2】:

    在PHP中,你可以使用preg_match()函数。

    $subject = "BM-BcbRqcFFSQUUmXFKsPJgVQPSiFA3Xash";
    $pattern = '/BM-[123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]{32,34}/';
    preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 0);
    print_r($matches);
    

    这是简化的新手正则表达式。可以换成更简洁的模式。

    【讨论】:

      【解决方案3】:

      另一个变体更快,无需环顾来测试每个字符

      /^BM-[1-9a-km-zA-HJ-NP-Z]{32,34}$/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-15
        • 2012-03-12
        • 2012-04-27
        • 1970-01-01
        • 2012-05-17
        • 2011-08-17
        • 2014-03-08
        • 2011-08-27
        相关资源
        最近更新 更多