2012-02-10 44 views
70

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

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

+0

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 lọc những thứ không phải là hệ thập lục phân. – Blender

Trả lời

116

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

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

Matches biểu bắt đầu với một 0, sau bởi hoặc là một thường hoặc in hoa x, theo sau là một hoặc nhiều ký tự trong phạm vi 0-9, hoặc af, hoặc AF

+20

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

+12

@NiklasB. Cách viết tắt của bạn chỉ hợp lệ nếu sử dụng regex perl, 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 làm việc cho cả hai perl và POSIX regex. –

+0

OK! 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 nên làm việc tốt hơn:^[0-9A-F] + $ Nó cũng có thể nhận ra mô hình hex như: '535GH0G73' Đối với Java, chúng ta có thể sử dụng ví dụ String.matches() để kiểm tra này .. Cảm ơn các bạn đã trả lời :) – saltmotor

29

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, i làm cho trường hợp không phân biệt chữ hoa chữ thường.

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

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

/\h+/ 

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

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

GIA TĂNG THÊM - Nếu 0x cần phải được tùy chọn (như câu hỏi ngụ ý):

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

bạn có thể giải thích cho tôi lý do RE ở trên không? – saltmotor

+2

@noobDroid Cụ thể bạn muốn tôi giải thích điều gì? – SimonMayer

10

này sẽ phù hợp có hoặc không có 0x tiền tố

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

14

Không phải là một vấn đề lớn, nhưng hầu hết động cơ regex supp ort các lớp nhân vật POSIX và có [:xdigit:] cho các ký tự hex phù hợp, đơn giản hơn so với các công cụ phổ biến 0-9a-fA-F. (. Tức là với tùy chọn 0x)

Vì vậy, các regex theo yêu cầu là: /(0x)?[[:xdigit:]]+/

7

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

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

Điều này đảm bảo rằng bạn không có nhiều hơn 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 ký tự hợp lệ không thành công nối.

3

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

[0-9a-fA-F] 

với:

[[:xdigit:]] 
+0

Đây phải là câu trả lời tự chứa. –

3

Chỉ cần cho các hồ sơ tôi sẽ xác định như sau:

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

nào khác ở chỗ nó kiểm tra xem 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 ta có một ký tự.

0

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 khung cho C++ Qt nhưng nó có thể giải quyết vấn đề trong các trường hợp khác, phụ 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/

+0

Xin chào! Mặc dù điều này có thể đúng với perl, nhưng dường như không phải là trường hợp cho Biểu thức chính quy trong tất cả các ngôn ngữ lập trình. Theo [this] (http://www.regular-expressions.info/unicode.html) '\ x' tương đương với' \ u' trong các ngôn ngữ khác. – Maurice

+0

"espaific anda" là gì? –

Các vấn đề liên quan