Regex与位消息地址匹配


Regex to match bitmessage address

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

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

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

文件中说,"BM-"前缀后的地址部分的长度在32-34个字符之间。

我不确定regex是否能做到这一点,我很难让它在特定的长度上匹配,有效的a-z减去排除的字符。

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

来源:

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

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

这可以通过regex、轻松实现

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

演示

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

如果此位消息地址位于行的中间或某个部分,请移除起始和结束锚。

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

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

这是一个简化的新手正则表达式。它可以被一个更简洁的模式所取代。

另一个变体更快,无需环视即可测试每个字符

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