Como faço para criar uma expressão regular que detecta números hexadecimais em um texto?
Por exemplo, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' e '8BADF00D'.
Como faço para criar uma expressão regular que detecta números hexadecimais em um texto?
Por exemplo, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' e '8BADF00D'.
Respostas:
Que tal o seguinte?
0[xX][0-9a-fA-F]+
Corresponde à expressão começando com 0, seguido por um x inferior ou maiúsculo, seguido por um ou mais caracteres nos intervalos de 0-9, ou af, ou AF
/0x[\da-f]/i, mas caso contrário, +1.
A sintaxe exata depende de seus requisitos exatos e linguagem de programação, mas basicamente:
/[0-9a-fA-F]+/
ou, mais simplesmente, itorna não diferencia maiúsculas de minúsculas.
/[0-9a-f]+/i
Se você tiver sorte o suficiente para usar Ruby, pode fazer:
/\h+/
EDITAR - A resposta de Steven Schroeder me fez perceber que meu entendimento sobre o bit 0x estava errado, então atualizei minhas sugestões de acordo. Se você também quiser corresponder a 0x, os equivalentes são
/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i
ADICIONADO MAIS - Se 0x precisar ser opcional (como a pergunta sugere):
/(0x)?[0-9a-f]+/i
Não é grande coisa, mas a maioria dos motores regex suporta as classes de caracteres POSIX, e há [:xdigit:]para correspondência de caracteres hexadecimais, que é mais simples do que as 0-9a-fA-Fcoisas comuns .
Portanto, o regex conforme solicitado (ou seja, com opcional 0x) é:/(0x)?[[:xdigit:]]+/
Irá corresponder com ou sem 0xprefixo
(?:0[xX])?[0-9a-fA-F]+
Vale ressaltar que a detecção de um MD5 (que é um dos exemplos) pode ser feita com:
[0-9a-fA-F]{32}
Se você estiver usando Perl ou PHP, você pode substituir
[0-9a-fA-F]
com:
[[:xdigit:]]
Se estiver procurando por um caractere hexadecimal específico no meio da string, você pode usar "\ xhh", onde hh é o caractere em hexadecimal. Eu tentei e funciona. Eu uso o framework para C ++ Qt mas pode resolver problemas em outros casos, depende do tipo que você precisa usar (php, javascript, python, golang, etc.).
Esta resposta foi retirada de: http://ult-tex.net/info/perl/
Este garante que você não tenha mais do que três pares válidos:
(([a-fA-F]|[0-9]){2}){3}
Qualquer mais ou menos do que três pares de caracteres válidos não coincidem.
Caso você precise disso em uma entrada onde o usuário pode digitar 0e 0xtambém, mas não um número hexadecimal sem o 0xprefixo:
^0?[xX]?[0-9a-fA-F]*$
Outro exemplo: os valores hexadecimais para cores css começam com um sinal de sustenido ou hash (#), depois seis caracteres que podem ser um numeral ou uma letra entre A e F, inclusive.
^#[0-9a-fA-F]{6}