Ekspresi reguler untuk bilangan heksadesimal?


114

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

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


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


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

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



11

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

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

5

Jika Anda menggunakan Perl atau PHP, Anda dapat mengganti

[0-9a-fA-F]

dengan:

[[:xdigit:]]

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.


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/


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.


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]*$

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}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.