RegEx匹配比特币地址?

时间:2014-02-10 17:15:04

标签: regex bitcoin

我正在尝试根据these specs找出匹配比特币地址的正则表达式:

  

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

开头

我认为它看起来像这样

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

事情是,我对正则表达式并不擅长,而且我没有找到一个来源来确认这会创建假阴性。

我在网上发现了一个^1[1-9A-Za-z][^OIl]{20,40},但我甚至不知道[^OIl]部分是什么意思,它似乎与3比特币地址不匹配从...开始。

8 个答案:

答案 0 :(得分:55)

^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

将匹配以13开头的字符串,然后匹配z,AZ或0-9的25到34个字符,不包括l,{ {1}},IO(比特币地址中不是有效字符)。

答案 1 :(得分:13)

^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

比特币地址

  • 26-35 字母数字字符
  • 的标识符
  • 以数字 1或3
  • 开头
  • 随机数字
  • 大写
  • 小写字母
  • ,但大写字母O,大写字母I,小写字母l和数字0从不用于防止视觉模糊。

答案 2 :(得分:12)

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

  • 你最后没有$,所以它匹配任何以BC地址开头的字符串。
  • 您没有计算{27,34}中的第一个字符 - 应该是{26,33}

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

答案 3 :(得分:5)

^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$

基于新地址类型Bech32

答案 4 :(得分:2)

基于此处的描述: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

以下是我找到信息的其他链接:

答案 5 :(得分:1)

由于OP没有提供特定的用例(仅匹配条件),因此我在研究检测比特币地址的方法时遇到了这一点,因此希望回发并与社区共享。

提供的这些RegEx将在行的开头和/或行的末尾找到BitCoin地址。我的用例是,随着勒索/勒索(参考:https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/)的兴起,在电子邮件的正文中找到BitCoin地址-因此,这些解决方案不是有效的解决方案(如下所述)。由于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管理员)。当我进一步审查以电子邮件方式检测身体内容时,如果观察到其他FP情况或更有效的RegEx,我将进行更新。

塞思

答案 6 :(得分:0)

根据runeksErhard Dinhobl的答案,我得到了接受bech32和legacy的代码:

@Autowired ElasticsearchOperations operations;

...

SearchHits<MyDocument> searchHits = operations.search(searchQuery,
                                        MyDocument.class,
                                        IndexCoordinates.of("index-name");

包括测试网地址:

\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

答案 7 :(得分:0)

当您不希望收到完整的废话时,我不打算使用复杂的正则表达式进行最简单的验证。

\w{25,}