RegEx pour correspondre aux adresses Bitcoin?

J'essaie de trouver une expression régulière pour correspondre aux adresses Bitcoin selon Ces spécifications :

Une adresse Bitcoin, ou simplement une adresse, est un identifiant de 27-34 caractères alphanumériques, commençant par le nombre 1 ou 3 [...]

J'ai pensé que ça ressemblerait à quelque chose comme ça

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

La chose est, Je ne suis pas bon avec les expressions régulières et je n'ai pas trouvé une seule source pour confirmer celaPas créer false négatif.

J'en ai trouvé un en ligne qui est ^1[1-9A-Za-z][^OIl]{20,40}, mais je ne sais même pas ce que signifie la partie [^OIl] et il ne semble pas correspondre à 3 une adresse Bitcoin pourrait commencer.

29
demandé sur federicot 2014-02-10 21:15:03

6 réponses

[^OIl] correspond à n'importe quel caractère qui N'est pas O, I ou L. Les problèmes dans votre regex sont:

  • vous n'avez pas de $ à la fin, donc il correspondrait à n'importe quelle chaîne commençant par une adresse BC.
  • vous n'avez pas compté le premier caractère dans votre {27,34} - cela devrait être {26,33}

Cependant, comme mentionné dans un commentaire, une expression rationnelle n'est pas un bon moyen de valider une adresse bitcoin.

11
répondu ThiefMaster 2014-02-10 17:17:37
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

Correspondra à une chaîne qui commence par 1 ou 3 et, après cela, contient 26 à 33 caractères de a-z, A-Z, 0-9, excluant O, I et l (caractères non valides dans une adresse Bitcoin).

48
répondu runeks 2016-06-16 00:03:55
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

L'adresse Bitcoin est

  • identificateur de 26-35 caractères alphanumériques
  • début avec le nombre 1 ou 3
  • chiffres aléatoires
  • majuscules
  • lettres minuscules
  • sauf que la lettre majuscule O, la lettre majuscule I, LA LETTRE MINUSCULE l et le nombre 0 ne sont jamais utilisés pour éviter toute ambiguïté visuelle.
11
répondu FranciscoA 2015-06-29 10:13:18
^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$

Basé sur le nouveau type d'adresse Bech32

4
répondu Victor 2018-02-06 13:13:10

Basé sur la description ici: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki je dirais que l'expression rationnelle pour une adresse bitcoin bech32 pour la Version 1 et la Version 0 (uniquement pour mainnet) est:

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

Voici quelques autres liens où j'ai trouvé infos:

1
répondu Erhard Dinhobl 2018-05-17 13:23:30

Comme le PO n'a pas fourni de cas d'utilisation spécifique (uniquement des critères correspondants) et je suis tombé sur cela en recherchant des méthodes pour détecter les adresses BitCoin, je voulais poster et partager avec la communauté.

Ces RegEx fournies trouveront des adresses BitCoin soit au début d'une ligne et/ou à la fin de la ligne. Mon cas d'utilisation était de trouver des adresses BitCoin dans le corps d'un e-mail compte tenu de la montée du chantage / sextortion (référence: https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/) - donc ce n'étaient pas des solutions efficaces (comme indiqué plus loin). L'expression rationnelle proposée attrapera de nombreux FPs dans les e-mails, en raison des noms de fichiers et d'autres identifiants dans les URL. Je ne frappe pas les solutions, car elles fonctionnent pour certains cas d'utilisation, mais elles ne fonctionnent tout simplement pas pour les miennes. Une variante a attrapé de nombreux spams dans un court laps de temps d'alerte passive (exemples ci-dessous).

Voici mon test cas:

--------------------------------------------------------
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

Quelques exemples de RegEx que j'ai testés (ne listera pas ceux que je frapperais pour globbing gourmand avec backtraces):

^[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)

L'expression rationnelle actuelle que j'évalue qui attrape tous mes exemples de cas connus/fabriqués et élimine les FPs connus (en évitant spécifiquement la fin de la période de phrase pour le nom de fichier URL FPs):

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

Un point de référence pour les temps d'exécution (affiche le coût en étapes et en temps): https://regex101.com/

, n'hésitez pas à peser ou à fournir suggestions d'améliorations (Je ne suis en aucun cas un maître RegEx). Comme je le vérifie davantage contre la détection par courrier électronique du contenu du corps, je mettrai à jour si d'autres cas de FP sont observés ou si une expression rationnelle plus efficace est dérivée.

Seth

1
répondu Seth 2018-07-19 01:09:10