Можно ли использовать Regex через Hexadecimal, чтобы найти адреса электронной почты
Не уверен, что это вообще возможно, но я искал использование Regex, чтобы получить адрес электронной почты в шестнадцатеричном формате. По сути, это создание некоторых из моих автоматизированных инструментов судебной экспертизы, но у меня возникают проблемы при создании подходящего алгоритма Regex.
Regex для электронной почты: /^([a-z0-9_.-]+)@([\da-z.-]+).([az.]]2,6 rout)$/
Шестнадцатеричные значения:
@ = 40
. = 2E
.com = 636f6d
_ = 5f
A/a = 41/61 [1]
Z/z = 5a/7a
- = 2d
Это то, что у меня есть на данный момент (учитываются только строчные буквы и.com). Но это не работает! Я что-то напутал?
"/^([61-7a]+)40([61-7a]+)23(636f6d)$/"
[1] Я знаю, что электронная почта может быть только в нижнем регистре, но мне нужно учитывать и заглавные.
5 ответов
определить классы
@ = 40
. = 2E
com = 636f6d
_ = 5f
a-z = (4[1-9a-f]|5[0-9a])
A-Z = (6[1-9a-f]|7[0-9a])
- = 2d
подставить в ваше регулярное выражение
/^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$/
/^(((4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])|[0-9]|5f|2E|2d)+)40(([0-9]|(4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])|2E|2d)+)2E(((4[1-9a-f]|5[0-9a])|(6[1-9a-f]|7[0-9a])){2,6})$/
ломается до...
/^
(
(
(4[1-9a-f]|5[0-9a]) // a-z
|(6[1-9a-f]|7[0-9a]) // A-Z
|[0-9] // 0-9
|5f // _
|2E // .
|2d // -
)+ // 1 or more times
)
40
(
(
[0-9] // 0-9
|(4[1-9a-f]|5[0-9a]) // a-z
|(6[1-9a-f]|7[0-9a]) // A-Z
|2E // .
|2d // -
)+ // 1 or more times
)
2E // .
(
(
(4[1-9a-f]|5[0-9a]) // a-z
|(6[1-9a-f]|7[0-9a]) // A-Z
){2,6} // between 2 and 6 times
)$/
Я думаю, что вы подходите к проблеме неправильно. Предполагая, что вы используете стандартные шестнадцатеричные эквиваленты, вы должны сначала преобразовать электронную почту из шестнадцатеричной, а затем использовать регулярное выражение электронной почты. Это можно сделать, просто обрабатывая электронную почту двумя символами за раз, и используя chr(int('piece, 16))
на каждом куске.
Я не могу нигде оставлять комментарии, так как я думаю, что на эти вопросы уже дан ответ, но я думаю, что это нужно сказать.
Подход, который вы используете, на самом деле хуже, чем преобразование каждого отдельного символа в эквивалент ASCII. Вы фактически конвертируете каждый байт в 2 символа ASCII.
Просто для ссылки на часть шаблона REGEX, который вы опубликовали в качестве окончательного / рабочего шаблона: 4[0-9a-fA-F]
Вы пытаетесь найти символы @ABCDEFGHIJKLMNO
, У тебя есть a-f
а также A-F
потому что вы пытаетесь учесть, что шестнадцатеричный код хранится в верхнем или нижнем регистре. Шестнадцатеричный код на жестком диске не сохраняется в верхнем или нижнем регистре (он даже не сохраняется в шестнадцатеричных кодах). Вы учитываете любой инструмент, который представляет эти данные вам - в ASCII.
Какой инструмент вы используете для доступа к этим данным?
Если вы используете python для чтения файла изображения dd, то вам нужно использовать регулярное выражение, которое идет после необработанных данных. Это было бы что-то вроде [\x40-\x4f]
повторить вышеизложенное. Это все ненужно, хотя, потому что [@-O]
сделает то же самое.
Я не уверен, как именно вы это тестируете, но я подозреваю, что вы вставляете шестнадцатеричные коды в онлайн-механизм тестирования REGEX. Затем этот механизм тестирования интерпретирует эти шестнадцатеричные коды как 2 отдельных символа, а не как пару кусочков байта.
Немного в стороне от того, чего вы хотите достичь, но взгляните на Bulk Extractor, который анализирует диск, выделяет адреса электронной почты и перечисляет их в порядке популярности.
Я думаю, что вам нужно взглянуть на документацию по регулярным выражениям в Python (http://docs.python.org/2/library/re.html).
Например, [61-7a] будет соответствовать любому из 6, 1-7 или a.