RegEx для соответствия Биткойн-адресам?

Я пытаюсь придумать регулярное выражение, чтобы соответствовать биткоин адреса в соответствии с параметры:

биткоин-адрес или просто адрес, является идентификатором 27-34 буквенно-цифровые символы, начинающиеся с числа 1 или 3 [...]

Я думал, это будет выглядеть примерно так

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

дело в том, что я плохо разбираюсь в регулярных выражениях, и я не нашел ни одного источника, чтобы подтвердить это не создание ложных негативов.

Я нашел один онлайн это ^1[1-9A-Za-z][^OIl]{20,40}, но я даже не знаю, что с [^OIl] часть означает, и она, похоже, не соответствует 3 биткойн-адрес может начинаться с.

6 ответов


[^OIl] соответствует любому символу, который не O, I или l. Проблемы в вашем регулярном выражении:

  • нет $ в конце, поэтому он будет соответствовать любой строке, начинающейся с адреса BC.
  • вы не посчитали первый символ в вашем {27,34} - это должно быть {26,33}

однако, как упоминалось в комментарии, регулярное выражение не является хорошим способом проверки адреса биткойна.


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

будет соответствовать строке, которая начинается с1 или 3 и после этого содержит от 26 до 33 символов a-z, A-Z, 0-9, исключая O, I и l (недопустимые символы в биткойн-адресе).


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

биткоин-адрес

  • идентификатор 26-35 символы
  • начинается с 1 или 3
  • случайные цифры
  • верхний
  • строчные буквы
  • за исключением того, что прописные буквы O прописные буквы I, строчная буква l, и никогда не используются для предотвращения визуального двусмысленность.

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

на основе нового адреса типа Bech32


на основе описания здесь:https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki я бы сказал, что регулярное выражение для биткойн-адреса Bech32 для версии 1 и версии 0 (только для mainnet):

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

вот некоторые ссылки, где я нашел infos:


поскольку OP не предоставил конкретный вариант использования (только критерии соответствия), и я столкнулся с этим в исследованиях методов обнаружения биткойн-адресов, хотел опубликовать и поделиться с сообществом.

эти предоставленные регулярные выражения найдут биткойн-адреса либо в начале строки, либо в конце строки. Мой случай использования состоял в том, чтобы найти биткойн-адреса в теле электронной почты, учитывая рост шантажа/sextortion (ссылка: https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/)- таким образом, это не были эффективные решения (как описано ниже). Предлагаемое регулярное выражение поймает много FPs в электронной почте из-за имен файлов и других идентификаторов в URL-адресах. Я не стучу по решениям, поскольку они работают для определенных случаев использования, но они просто не работают для моего. Один вариант поймал много спам-писем в течение короткого периода пассивного оповещения (примеры следуют).

здесь являются ли мои тестовые случаи:

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

некоторые образцы регулярных выражений, которые я тестировал (не перечислю те, которые я бы постучал за жадный глоббинг с обратными следами):

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

текущее регулярное выражение, которое я оцениваю, которое ловит все мои известные / созданные примеры и устраняет известные FPs (в частности, избегая окончания периода предложения для URL filename FPs):

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

одна контрольная точка для времен выполнения (показывает цену в шагах и времени): https://regex101.com/

пожалуйста, не стесняйтесь взвешивать или предоставлять предложения по улучшениям (я ни в коем случае не мастер регулярных выражений). Поскольку я далее проверяю его против обнаружения электронной почты содержимого тела, я обновлю, если будут наблюдаться другие случаи FP или будет получено более эффективное регулярное выражение.

сет