RegEx匹配比特币地址?

fed*_*o-t 33 regex bitcoin

我正在尝试根据这些规范提出一个匹配比特币地址的正则表达式:

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

我认为它看起来像这样

/^[13][a-zA-Z0-9]{27,34}/
Run Code Online (Sandbox Code Playgroud)

事实是,我对正则表达式并不擅长,而且我没有找到一个单一的来源来确认这不会产生假阴性.

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

run*_*eks 55

^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
Run Code Online (Sandbox Code Playgroud)

将匹配以任一开头的字符串13和,之后,在25至34个字符或者AZ,AZ的,或0-9,但不包括l,I,O0(在一个比特币地址不是有效的字符).

  • 感谢提供至少部分正确的解决方案,而不是抱怨不能像其他海报一样做什么. (7认同)
  • bc1q5lm8v27uf9v8nz6yczg3gxraflxlas4jvr0zuf 显示为“无效” - 但它是一个有效地址...... (4认同)
  • 由于一个有效的比特币候选者必须是26和35个字符长,所以间隔应该是"{25,34}",因为在开始时`^ [13]`从计数中取走一个字符.请参阅规格:https://en.bitcoin.it/wiki/Address (2认同)

Fra*_*coA 14

^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
Run Code Online (Sandbox Code Playgroud)

比特币地址是

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


Thi*_*ter 13

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

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

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

  • 在我看来,正则表达式的目的是找到*潜在的*比特币地址,不一定是有效的地址. (5认同)

Fel*_*ipe 7

根据runeksErhard Dinhobl的回答,我得到了接受 bech32 和遗产的答案:

\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
Run Code Online (Sandbox Code Playgroud)

包括测试网地址:

\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
Run Code Online (Sandbox Code Playgroud)

仅测试网:

\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
Run Code Online (Sandbox Code Playgroud)


Vic*_*tor 6

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

基于新的地址类型Bech32

  • 有效地址 bc1q4r8h8vqk02gnvlus758qmpk8jmajpy2ld23xtr73a39ps0r9z82qq0qqye 不起作用。 (2认同)
  • 将最后一个数字更改为 59 遵循 Felipe 的示例 (2认同)