我正在尝试根据these specs找出匹配比特币地址的正则表达式:
比特币地址或简称地址是27-34的标识符 字母数字字符,以数字1或3 [...]
开头
我认为它看起来像这样
/^[13][a-zA-Z0-9]{27,34}/
事情是,我对正则表达式并不擅长,而且我没有找到一个来源来确认这会不创建假阴性。
我在网上发现了一个^1[1-9A-Za-z][^OIl]{20,40}
,但我甚至不知道[^OIl]
部分是什么意思,它似乎与3
比特币地址不匹配从...开始。
答案 0 :(得分:55)
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
将匹配以1
或3
开头的字符串,然后匹配z,AZ或0-9的25到34个字符,不包括l
,{ {1}},I
和O
(比特币地址中不是有效字符)。
答案 1 :(得分:13)
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
比特币地址
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)
根据runeks和Erhard 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,}