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
, и никогда не используются для предотвращения визуального двусмысленность.
на основе описания здесь: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 или будет получено более эффективное регулярное выражение.
сет