Nếu bạn muốn chụp R, G, B trong các phân nhóm khác nhau, do đó bạn có thể trích xuất chúng bằng cách sử (match-string group)
, bạn cần để có ba nhóm dấu ngoặc đơn khác nhau trong regexp của bạn tại một số điểm.
\(...\)\(...\)\(...\)
Ngược lại, nếu bạn sử dụng một mô hình lặp lại như
\(...\)\{3\}
bạn chỉ có một nhóm, và sau khi trận đấu nó sẽ chỉ chứa giá trị của trận đấu cuối cùng. Vì vậy, nói rằng, nếu bạn có một cái gì đó dọc theo dòng của
\([[:xdigit:]]\{2\}\)\{3\}
nó sẽ phù hợp với một chuỗi như "A0B1C2", nhưng (match-string 1)
sẽ chỉ chứa các nội dung của trận đấu cuối cùng, tức là "C2", bởi vì các định nghĩa regexp chỉ một nhóm. Vì vậy, về cơ bản bạn có hai lựa chọn: sử dụng regexp nhỏ gọn, chẳng hạn như số thứ ba, nhưng thực hiện thêm một số chuỗi con để trích xuất số hex như Sean gợi ý hoặc sử dụng regexp phức tạp hơn, chẳng hạn như cụm từ đầu tiên của bạn, cho phép bạn truy cập vào ba kết hợp phụ thuận tiện hơn.
Nếu bạn chủ yếu lo lắng về mã dễ đọc, bạn luôn có thể làm điều gì đó như
(let ((hex2 "\\([[:xdigit:]]\\{2\\}\\)"))
(concat "#" hex2 hex2 hex2))
để xây dựng một regexp phức tạp hơn như vậy trong một cách nào ít dư thừa, theo đề nghị của tripleee.
Tại sao bạn muốn làm điều đó? Để dễ đọc? – Thomas
Chỉ tò mò: Tôi tự hỏi liệu regexps có thể phù hợp với các mẫu lặp lại hay không. – Elena
Vấn đề là bạn sẽ không thể tham khảo 3 nhóm khác nhau sau đó, phải không? Vậy làm thế nào bạn sẽ trích xuất các giá trị R, G, B một cách riêng biệt? – Thomas