Expressão regular para um número hexadecimal?

113

Como faço para criar uma expressão regular que detecta números hexadecimais em um texto?

Por exemplo, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' e '8BADF00D'.

saurcery
fonte
1
Regex realmente não analisa. Experimente extrair todas as coisas parecidas com números e peneire aquelas que não são hexadecimais.
Blender

Respostas:

193

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

Steven Schroeder
fonte
35
Isso poderia ser reduzido para /0x[\da-f]/i, mas caso contrário, +1.
Niklas B.
20
@NiklasB. Sua abreviação só é válida se estiver usando perl regex, se estiver usando POSIX regex, então a solução de Steven é a mais curta. De qualquer forma, a solução de Steven funciona para perl e POSIX regex.
David M. Syzdek
Entendi! A solução de Steven é boa se o número hexadecimal começar com 0x ou 0X. Este deve funcionar melhor: ^ [0-9A-F] + $ Ele também pode reconhecer padrões hexadecimais como: '535GH0G73' Para Java, podemos usar, por exemplo, String.matches () para verificar isso .. Obrigado pessoal pela resposta :)
saurcery de
2
'0x [\ da-f] {2}' parece melhor para limitar o número também
Yazan Rawashdeh
2
Isso corresponderia ao segundo e terceiro números de exemplo, 0acdadecf822eeff32aca5830e438cb54aa722e3 e 8BADF00D?
Peter Mortensen
43

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
SimonMayer
fonte
você pode me explicar o motivo do RE acima?
saurcery de
4
@noobDroid O que especificamente você gostaria que eu explicasse?
SimonMayer
18

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:]]+/

pequeno
fonte
11

Irá corresponder com ou sem 0xprefixo

(?:0[xX])?[0-9a-fA-F]+

Pawel Furmaniak
fonte
11

Vale ressaltar que a detecção de um MD5 (que é um dos exemplos) pode ser feita com:

[0-9a-fA-F]{32}
Adaddinsane
fonte
5

Se você estiver usando Perl ou PHP, você pode substituir

[0-9a-fA-F]

com:

[[:xdigit:]]
joaquim
fonte
Esta deve ser uma resposta independente.
Peter Mortensen de
3

Apenas para registro, eu especificaria o seguinte:

/^[xX]?[0-9a-fA-F]{6}$/

O que difere por verificar que deve conter os seis caracteres válidos e em x minúsculo ou maiúsculo no caso de termos um.

maluco
fonte
2

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/

Fábio Borges
fonte
Ei! Embora isso possa ser verdade para perl, não parece ser o caso para Expressões regulares em todas as linguagens de programação. De acordo com isso \x é o equivalente a \uem outras línguas.
Maurice
O que é "especific anda"?
Peter Mortensen,
0

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.

Necessidades Locais
fonte
0

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]*$
Paul Razvan Berg
fonte
0

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}
Tommy Vasquez
fonte