正则表达式匹配比特币地址?

Posted

技术标签:

【中文标题】正则表达式匹配比特币地址?【英文标题】:RegEx to match Bitcoin addresses? 【发布时间】:2014-03-08 03:59:36 【问题描述】:

我正在尝试根据these specs提出一个正则表达式来匹配比特币地址:

比特币地址,或简称地址,是 27-34 的标识符 以数字 1 或 3 开头的字母数字字符 [...]

我认为它看起来像这样

/^[13][a-zA-Z0-9]27,34/

问题是,我不擅长正则表达式,而且我还没有找到单一来源来确认这不会产生假阴性。

我在网上找到了一个^1[1-9A-Za-z][^OIl]20,40,但我什至不知道[^OIl] 部分是什么意思,而且它似乎与比特币地址开头的3 不匹配。

【问题讨论】:

您引用的页面有一个“地址验证”部分。为什么不使用那里链接中提供的技术? (引用:“[...] 建议使用this thread 中的方法,而不是只检查字符串长度、允许的字符或地址是否以 1 或 3 开头”) @phimuemue 如果 all 比特币地址具有这种格式,那么我看不出这不起作用的原因。此外,我不是在寻找严格的验证(毕竟,它可能是一个有效的地址,但还不存在),而是丢弃明显无效的地址。 @fedeetz:比特币地址确实包含校验和。您无法使用正则表达式验证比特币地址,因为 all 比特币地址具有该校验和。确实,您的正则表达式会丢弃许多明显无效的地址......但是您的正则表达式也会接受大量无效的地址。该校验和的真正目的是 防止人们使用无效地址,我倾向于认为比特币的作者是非常聪明的人并且知道他们在做什么。进行“验证”而不验证其目的是验证的校验和是没有意义的。 @TacticalCoder 正如我所说,这对我来说不是问题,只要它丢弃明显无效的地址并且不会产生误报,就足够了。这不适用于向公众开放的应用程序,仅对几个开发人员开放。重点是,如果他们有拼写错误或只复制了一半的地址,应用程序会警告他们。 rosettacode.org/wiki/Bitcoin/address_validation 【参考方案1】:

我不喜欢复杂的解决方案,这个正则表达式用于最简单的验证,当您不想收到完全废话时。

\w25,

【讨论】:

【参考方案2】:

根据runeks 和Erhard Dinhobl 的回答,我得到了这个接受bech32 和legacy:

\b(bc(0([ac-hj-np-z02-9]39|[ac-hj-np-z02-9]59)|1[ac-hj-np-z02-9]8,87)|[13][a-km-zA-HJ-NP-Z1-9]25,35)\b

包括测试网地址:

\b((bc|tb)(0([ac-hj-np-z02-9]39|[ac-hj-np-z02-9]59)|1[ac-hj-np-z02-9]8,87)|([13]|[mn2])[a-km-zA-HJ-NP-Z1-9]25,39)\b

仅测试网:

\b(tb(0([ac-hj-np-z02-9]39|[ac-hj-np-z02-9]59)|1[ac-hj-np-z02-9]8,87)|[mn2][a-km-zA-HJ-NP-Z1-9]25,39)\b

【讨论】:

【参考方案3】:
^[13][a-km-zA-HJ-NP-Z1-9]25,34$

将匹配以 13 开头的字符串,然后匹配 az、AZ 或 0-9 的 25 到 34 个字符,不包括 lIO0(比特币地址中的无效字符)。

【讨论】:

由于有效的比特币候选者必须是 26 和 35 个字符长,因此间隔应该是 25, 34,因为开头的 ^[13] 会从计数中删除一个字符。查看规格:en.bitcoin.it/wiki/Address 为了防止视觉模糊,从不使用大写字母“O”、大写字母“I”、小写字母“l”和数字“0”。 bc1q5lm8v27uf9v8nz6yczg3gxraflxlas4jvr0zuf 显示为invalid - 但它是一个有效地址...【参考方案4】:

由于 OP 没有提供特定的用例(仅匹配标准),我在研究检测比特币地址的方法时发现了这一点,想回帖并与社区分享。

提供的这些 RegEx 将在行首和/或行尾找到比特币地址。鉴于勒索/性勒索的兴起,我的用例是在电子邮件正文中查找比特币地址(参考:https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/) - 所以这些不是有效的解决方案(如下所述)。由于 URL 中的文件名和其他标识符,拟议的 RegEx 将在电子邮件中捕获许多 FP。我没有敲定解决方案,因为它们适用于某些用例,但它们根本不适用于我的。一种变体在被动警报的短时间内捕获了许多垃圾邮件(示例如下)。

这是我的测试用例:

--------------------------------------------------------
BitCoin blackmail formats observed (my org and online):
--------------------------------------------------------
BTC Address: 1JHwenDp9A98XdjfYkHKyiE3R99Q72K9X4 
BTC Address: 1Unoc4af6gCq3xzdDFmGLpq18jbTW1nZD
BTC Address: 1A8Ad7VbWDqwmRY6nSHtFcTqfW2XioXNmj
BTC Address: 12CZYvgNZ2ze3fGPFzgbSCELBJ6zzp2cWc
BTC Address: 17drmHLZMsCRWz48RchWfrz9Chx1osLe67

Receiving Bitcoin Address: 15LZALXitpbkK6m2QcbeQp6McqMvgeTnY8
Receiving Bitcoin Address: 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5

--------------------------------------------------------
Other possible BitCoin test cases I added:
--------------------------------------------------------
- What if text comes before and/or after on same line?  Or doesn't contain BitCoin/BTC/etc. anywhere (or anywhere close to the address)?
    Send BitCoin payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5
    1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.
    Send payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.

- Standalone address:
    1Dvd7Wb72JBTbAcfTrxSJCZZuf4tsT8V72

--------------------------------------------------------
Redacted Body content generating FPs from spam emails:
--------------------------------------------------------
src=3D"https://example.com/blah=3D2159024400&t=3DXWP9YVkAYwkmif9RgKeoPhw2b1zdMnMzXZSGRD_Oxkk"

"cursor:pointer;color:#6A6C6D;-webkit-text-size-blahutm_campaign%253Drdboards%2526e_t%253Dd5c2deeaae5c4a8b8d2bff4d0f87ecdd%2526utm_cont=blah

src=3D"https://example.com/blah/74/328e74997261d5228886aab1a2da6874.jpg" 

src=3D"https://example.com/blah-1c779f59948fc5be8a461a4da8d938aa.jpg"

href=3D"https://example.com/blah-0ff3169b28a6e17ae8a369a3161734c1?alert_=id=blah

我测试的一些 RegEx 样本(不会列出我会因为贪婪的回溯而敲掉的样本):

^[13][a-km-zA-HJ-NP-Z1-9]25,34$
[13][a-km-zA-HJ-NP-Z1-9]25,34$
    (Too narrow and misses BitCoin addresses within a paragraph)

(bc1|[13])[a-zA-HJ-NP-Z0-9]25,39$
    (Still misses text after BTC on same line and triples execution time)

\W[13][a-km-zA-HJ-NP-Z1-9]25,34\W
    (Too broad and catches URL formats)

我正在评估的当前 RegEx 捕获了我所有已知/精心设计的示例案例并消除了已知的 FP(特别是避免 URL 文件名 FP 的句期结束):

[13][a-km-zA-HJ-NP-Z1-9]25,34\s

执行时间的一个参考点(以步骤和时间显示成本):https://regex101.com/

请随时权衡或提供改进建议(我绝不是 RegEx 大师)。当我进一步审查它对 Body 内容的电子邮件检测时,我将更新是否观察到其他 FP 案例或更有效的 RegEx。

赛斯

【讨论】:

【参考方案5】:

根据此处的描述:https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki 我会说版本 1 和版本 0(仅用于主网)的 Bech32 比特币地址的正则表达式是:

\bbc(0([ac-hj-np-z02-9]39|[ac-hj-np-z02-9]59)|1[ac-hj-np-z02-9]8,87)\b

这是我找到信息的其他一些链接:

https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki http://r6.ca/blog/20180106T164028Z.html

【讨论】:

【参考方案6】:
^(bc1|[13])[a-zA-HJ-NP-Z0-9]25,39$

基于新的地址类型Bech32

【讨论】:

有效地址bc1q4r8h8vqk02gnvlus758qmpk8jmajpy2ld23xtr73a39ps0r9z82qq0qqye不起作用。 将最后一个数字更改为 59 抓住了 Felipe 的例子 所以如果地址在文本中,我需要删除^$ 吗?【参考方案7】:
^[13][a-km-zA-HJ-NP-Z1-9]25,34$

比特币地址是

26-35 个字母数字字符的标识符 以数字1或3 开头 随机数字 大写 小写字母 除了大写字母O、大写字母I、小写字母l和数字0之外,绝不会使用以防止视觉模糊。

【讨论】:

【参考方案8】:

[^OIl] 匹配任何不是 O、I 或 l 的字符。您的正则表达式中的问题是:

末尾没有$,因此它会匹配任何以 BC 地址开头的字符串。 您没有计算27,34 中的第一个字符 - 那应该是26,33

但是,正如评论中提到的,正则表达式不是验证比特币地址的好方法。

【讨论】:

在我看来,正则表达式的目的是寻找潜在比特币地址,不一定是有效地址。 Regex 模块适用于轻量级的浏览器插件或网络爬虫。 或者找到有效地址不一定是现有地址。您的区块链中是否存在地址取决于您何时以及多久进行一次。确定地址是否有效是完全不同的练习。

以上是关于正则表达式匹配比特币地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配IP地址

如何用正则表达式匹配出如下代码中的IP地址跟IP地址归属地?

匹配地址的正则表达式:匹配具有不同结构的地址的问题

正则表达式,匹配IP地址的,求大神帮我解释这行代码。^([1-9][1-9][0-9]1[0-

题目地址(10. 正则表达式匹配)

正则表达式----------匹配IP地址