Biểu thức chính quy cho một số thập lục phân?


114

Làm cách nào để tạo một biểu thức chính quy phát hiện các số thập lục phân trong văn bản?

Ví dụ: '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' và '8BADF00D'.


1
Regex không thực sự phân tích cú pháp. Hãy thử trích xuất tất cả những thứ giống như số và chọn ra những thứ không phải là hệ thập lục phân.
Máy xay sinh tố

Câu trả lời:


193

Làm thế nào về sau đây?

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

Đối sánh biểu thức bắt đầu bằng 0, sau đó là x viết thường hoặc viết hoa, theo sau là một hoặc nhiều ký tự trong phạm vi 0-9 hoặc af, hoặc AF


35
Điều đó có thể được rút ngắn thành /0x[\da-f]/i, nhưng nếu không, +1.
Niklas B.

20
@NiklasB. Tốc ký của bạn chỉ hợp lệ nếu sử dụng perl regex, nếu sử dụng POSIX regex, thì giải pháp của Steven là ngắn nhất. Dù bằng cách nào, giải pháp của Steven hoạt động cho cả perl và POSIX regex.
David M. Syzdek

Hiểu rồi! Giải pháp của Steven là tốt nếu số hex bắt đầu bằng 0x hoặc 0X. Cái này sẽ hoạt động tốt hơn: ^ [0-9A-F] + $ Nó cũng có thể nhận ra các mẫu hex như: '535GH0G73' Đối với Java, chúng tôi có thể sử dụng ví dụ: String.matches () để kiểm tra điều này .. Cảm ơn các bạn đã phản hồi :)
saurcery

2
'0x [\ da-f] {2} tốt hơn hết là nên giới hạn số lượng
Yazan Rawashdeh

2
Điều đó có khớp với số mẫu thứ hai và thứ ba, 0acdadecf822eeff32aca5830e438cb54aa722e3 và 8BADF00D không?
Peter Mortensen,

44

Cú pháp chính xác phụ thuộc vào yêu cầu chính xác và ngôn ngữ lập trình của bạn, nhưng về cơ bản:

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

hoặc đơn giản hơn, iphân biệt chữ hoa chữ thường.

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

Nếu bạn đủ may mắn để sử dụng Ruby, bạn có thể làm:

/\h+/

CHỈNH SỬA - Câu trả lời của Steven Schroeder khiến tôi nhận ra sự hiểu biết của mình về bit 0x là sai, vì vậy tôi đã cập nhật các đề xuất của mình cho phù hợp. Nếu bạn cũng muốn đối sánh 0x, thì giá trị tương đương là

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

THÊM THÊM - Nếu 0x cần phải là tùy chọn (như câu hỏi ngụ ý):

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

bạn có thể giải thích cho tôi lý do ở trên RE?
ma thuật

4
@noobDroid Bạn muốn tôi giải thích cụ thể điều gì?
SimonMayer

18

Không phải là vấn đề lớn, nhưng hầu hết các công cụ regex đều hỗ trợ các lớp ký tự POSIX và có [:xdigit:]để khớp các ký tự hex, đơn giản hơn so với thông thường0-9a-fA-F thứ .

Vì vậy, regex theo yêu cầu (tức là. Với tùy chọn 0x) là:/(0x)?[[:xdigit:]]+/



11

Điều đáng nói là việc phát hiện MD5 (là một trong những ví dụ) có thể được thực hiện với:

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

5

Nếu bạn đang sử dụng Perl hoặc PHP, bạn có thể thay thế

[0-9a-fA-F]

với:

[[:xdigit:]]

Đây phải là một câu trả lời khép kín.
Peter Mortensen

3

Chỉ đối với bản ghi, tôi sẽ chỉ định như sau:

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

Mà khác ở chỗ nó kiểm tra rằng nó chứa sáu ký tự hợp lệ và chữ thường hoặc chữ hoa x trong trường hợp chúng tôi có một.


2

Nếu bạn đang tìm kiếm một ký tự hex cụ thể ở giữa chuỗi, bạn có thể sử dụng "\ xhh" trong đó hh là ký tự trong hệ thập lục phân. Tôi đã thử và nó hoạt động. Tôi sử dụng framework cho C ++ Qt nhưng nó có thể giải quyết vấn đề trong các trường hợp khác, tùy thuộc vào hương vị bạn cần sử dụng (php, javascript, python, golang, v.v.).

Câu trả lời này được lấy từ: http://ult-tex.net/info/perl/


Chào! Mặc dù điều này có thể đúng với perl, nhưng nó dường như không đúng với Biểu thức chính quy trong tất cả các ngôn ngữ lập trình. Theo điều này \x là tương đương với \utrong các ngôn ngữ khác.
Maurice

"Anda đặc biệt" là gì?
Peter Mortensen

0

Điều này đảm bảo bạn có không quá ba cặp hợp lệ:

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

Bất kỳ nhiều hơn hoặc ít hơn ba cặp ký tự hợp lệ đều không khớp.


0

Trong trường hợp bạn cần điều này trong đầu vào mà người dùng có thể nhập 00xcũng có thể nhập nhưng không phải là số hex không có 0xtiền tố:

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

0

Một ví dụ khác: Các giá trị thập lục phân cho các màu css bắt đầu bằng dấu thăng hoặc dấu thăng (#), sau đó là sáu ký tự có thể là một chữ số hoặc một chữ cái giữa A và F, bao gồm cả.

^#[0-9a-fA-F]{6}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.