Espressione regolare per un numero esadecimale?


114

Come si crea un'espressione regolare che rileva i numeri esadecimali in un testo?

Ad esempio, "0x0f4", "0acdadecf822eeff32aca5830e438cb54aa722e3" e "8BADF00D".


1
Regex non analizza davvero. Prova a estrarre tutte le cose simili a numeri e setaccia quelle che non sono esadecimali.
Blender

Risposte:


193

Che ne dici di quanto segue?

0[xX][0-9a-fA-F]+

Corrisponde all'espressione che inizia con uno 0, seguita da una x minuscola o maiuscola, seguita da uno o più caratteri negli intervalli 0-9, o af o AF


35
Potrebbe essere ridotto a /0x[\da-f]/i, ma in caso contrario, +1.
Niklas B.

20
@NiklasB. La tua scorciatoia è valida solo se usi perl regex, se usi POSIX regex, la soluzione di Steven è la più breve. In ogni caso, la soluzione di Steven funziona sia per perl che per le regex POSIX.
David M. Syzdek,

Fatto! La soluzione di Steven è buona se il numero esadecimale inizia con 0x o 0X. Questo dovrebbe funzionare meglio: ^ [0-9A-F] + $ Può anche riconoscere modelli esadecimali come: '535GH0G73' Per Java, possiamo usare ad esempio String.matches () per verificarlo .. Grazie ragazzi per la risposta :)
saurcery

2
"0x [\ da-f] {2}" probabilmente è meglio limitare anche il numero
Yazan Rawashdeh

2
Ciò corrisponderebbe al secondo e al terzo numero di esempio, 0acdadecf822eeff32aca5830e438cb54aa722e3 e 8BADF00D?
Peter Mortensen

44

La sintassi esatta dipende dai tuoi requisiti esatti e dal linguaggio di programmazione, ma fondamentalmente:

/[0-9a-fA-F]+/

o più semplicemente, lo irende insensibile al maiuscolo / minuscolo.

/[0-9a-f]+/i

Se sei abbastanza fortunato da usare Ruby, puoi fare:

/\h+/

EDIT - La risposta di Steven Schroeder mi ha fatto capire che la mia comprensione del bit 0x era sbagliata, quindi ho aggiornato i miei suggerimenti di conseguenza. Se vuoi anche trovare 0x, gli equivalenti sono

/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i

AGGIUNTO ALTRO - Se 0x deve essere facoltativo (come implica la domanda):

/(0x)?[0-9a-f]+/i

mi puoi spiegare il motivo di sopra RE?
saurcery

4
@noobDroid Cosa vorresti che spiegassi nello specifico?
Simon Mayer

18

Non è un grosso problema, ma la maggior parte dei motori regex supporta le classi di caratteri POSIX, e c'è [:xdigit:]per la corrispondenza dei caratteri esadecimali, che è più semplice delle 0-9a-fA-Fcose comuni .

Quindi, la regex richiesta (cioè con facoltativo 0x) è:/(0x)?[[:xdigit:]]+/



11

Vale la pena ricordare che il rilevamento di un MD5 (che è uno degli esempi) può essere eseguito con:

[0-9a-fA-F]{32}


3

Solo per la cronaca vorrei specificare quanto segue:

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

Che differisce dal fatto che controlla che deve contenere i sei caratteri validi e su x minuscola o maiuscola nel caso ne abbiamo uno.


2

Se stai cercando un carattere esadecimale specifico nel mezzo della stringa, puoi usare "\ xhh" dove hh è il carattere in esadecimale. Ho provato e funziona. Uso framework per C ++ Qt ma può risolvere problemi in altri casi, dipende dal gusto che devi usare (php, javascript, python, golang, ecc.).

Questa risposta è stata presa da: http://ult-tex.net/info/perl/


Hey! Anche se questo potrebbe essere vero per perl, non sembra essere il caso per le espressioni regolari in tutti i linguaggi di programmazione. Secondo questo \x è l'equivalente \uin altre lingue.
Maurice

Che cos'è "especific anda"?
Peter Mortensen,

0

Questo ti assicura di non avere più di tre coppie valide:

(([a-fA-F]|[0-9]){2}){3}

Eventuali più o meno di tre coppie di caratteri validi non corrispondono.


0

Nel caso in cui sia necessario all'interno di un input in cui l'utente può digitare 0e 0xanche ma non un numero esadecimale senza il 0xprefisso:

^0?[xX]?[0-9a-fA-F]*$

0

Un altro esempio: i valori esadecimali per i colori CSS iniziano con un cancelletto o un cancelletto (#), quindi sei caratteri che possono essere un numero o una lettera tra A e F inclusi.

^#[0-9a-fA-F]{6}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.