Ekspresi reguler untuk bilangan heksadesimal?

114

Bagaimana cara membuat ekspresi reguler yang mendeteksi angka heksadesimal dalam teks?

Misalnya, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3', dan '8BADF00D'.

saurcery
sumber
1
Regex tidak benar-benar mengurai. Coba ekstrak semua hal yang mirip angka dan saring yang bukan hexadecimal.
Blender

Jawaban:

193

Bagaimana dengan berikut ini?

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

Mencocokkan ekspresi yang dimulai dengan 0, diikuti oleh x huruf besar atau kecil, diikuti dengan satu atau beberapa karakter dalam rentang 0-9, atau af, atau AF

Steven Schroeder
sumber
35
Itu bisa disingkat menjadi /0x[\da-f]/i, tetapi sebaliknya, +1.
Niklas B.
20
@Niklas. Singkatan Anda hanya valid jika menggunakan perl regex, jika menggunakan POSIX regex, maka solusi Steven adalah yang terpendek. Bagaimanapun, solusi Steven bekerja untuk perl dan regex POSIX.
David M. Syzdek
Mengerti! Solusi oleh Steven bagus jika angka hex dimulai dengan 0x atau 0X. Yang ini akan bekerja lebih baik: ^ [0-9A-F] + $ Ia juga dapat mengenali pola hex seperti: '535GH0G73' Untuk Java, kita dapat menggunakan misalnya String.matches () untuk memeriksa ini .. Terima kasih teman-teman atas tanggapannya :)
saurcery
2
'0x [\ da-f] {2}' lebih tepat untuk membatasi jumlahnya juga
Yazan Rawashdeh
2
Apakah itu cocok dengan contoh nomor kedua dan ketiga, 0acdadecf822eeff32aca5830e438cb54aa722e3 dan 8BADF00D?
Peter Mortensen
44

Sintaks yang tepat bergantung pada persyaratan dan bahasa pemrograman Anda, tetapi pada dasarnya:

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

atau lebih sederhananya, imembuatnya peka huruf besar kecil.

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

Jika Anda cukup beruntung bisa menggunakan Ruby, Anda bisa melakukan:

/\h+/

EDIT - Jawaban Steven Schroeder membuat saya menyadari bahwa pemahaman saya tentang bit 0x salah, jadi saya telah memperbarui saran saya. Jika Anda juga ingin mencocokkan 0x, padanannya adalah

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

TAMBAHKAN LEBIH BANYAK - Jika 0x harus opsional (seperti yang tersirat dalam pertanyaan):

/(0x)?[0-9a-f]+/i
SimonMayer
sumber
dapatkah Anda menjelaskan alasan RE di atas?
saurcery
4
@noobDroid Apa yang secara spesifik ingin Anda jelaskan?
SimonMayer
18

Bukan masalah besar, tetapi sebagian besar mesin regex mendukung kelas karakter POSIX, dan ada [:xdigit:]untuk mencocokkan karakter hex, yang lebih sederhana daripada 0-9a-fA-Fhal - hal umum .

Jadi, regex seperti yang diminta (yaitu dengan opsional 0x) adalah:/(0x)?[[:xdigit:]]+/

smathy
sumber
11

Ini akan cocok dengan atau tanpa 0xprefiks

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

Pawel Furmaniak
sumber
11

Perlu disebutkan bahwa mendeteksi MD5 (yang merupakan salah satu contohnya) dapat dilakukan dengan:

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

Jika Anda menggunakan Perl atau PHP, Anda dapat mengganti

[0-9a-fA-F]

dengan:

[[:xdigit:]]
joachim
sumber
Ini harus menjadi jawaban mandiri.
Peter Mortensen
3

Sebagai catatan, saya akan menentukan yang berikut:

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

Yang berbeda karena ia memeriksa bahwa ia harus berisi enam karakter yang valid dan pada huruf kecil atau huruf besar x jika kita memilikinya.

batspy
sumber
2

Jika Anda mencari karakter heksadesimal tertentu di tengah string, Anda dapat menggunakan "\ xhh" di mana hh adalah karakter dalam heksadesimal. Saya sudah mencoba dan berhasil. Saya menggunakan kerangka kerja untuk C ++ Qt tetapi dapat menyelesaikan masalah dalam kasus lain, tergantung pada rasa yang perlu Anda gunakan (php, javascript, python, golang, dll.).

Jawaban ini diambil dari: http://ult-tex.net/info/perl/

Fábio Borges
sumber
Hei! Meskipun ini mungkin benar untuk perl, tampaknya tidak demikian halnya dengan Ekspresi Reguler di semua bahasa pemrograman. Menurut ini \x setara dengan \udalam bahasa lain.
Maurice
Apa itu "khusus anda"?
Peter Mortensen
0

Yang ini memastikan Anda memiliki tidak lebih dari tiga pasangan yang valid:

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

Lebih atau kurang dari tiga pasang karakter yang valid gagal untuk mencocokkan.

Kebutuhan Lokal
sumber
0

Jika Anda memerlukan ini dalam input di mana pengguna dapat mengetik 0dan 0xjuga tetapi bukan nomor hex tanpa 0xawalan:

^0?[xX]?[0-9a-fA-F]*$
Paul Razvan Berg
sumber
0

Contoh lain: Nilai heksadesimal untuk warna css dimulai dengan tanda pagar, atau hash (#), lalu enam karakter yang bisa berupa angka atau huruf antara A dan F, inklusif.

^#[0-9a-fA-F]{6}
Tommy Vasquez
sumber