正则表达式匹配比特币地址?
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$
将匹配以 1
或 3
开头的字符串,然后匹配 az、AZ 或 0-9 的 25 到 34 个字符,不包括 l
、I
、O
和0
(比特币地址中的无效字符)。
【讨论】:
由于有效的比特币候选者必须是 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地址归属地?