2009-08-05 35 views
5

Tôi đang sử dụng phương thức scan() của Ruby để tìm văn bản ở định dạng cụ thể. Sau đó tôi xuất nó thành một chuỗi được phân tách bằng dấu phẩy. Văn bản Tôi đang cố gắng để tìm sẽ trông như thế này:ruby ​​regex .scan

AB_ABCD_123456

Đây là những gì tôi đã đưa ra cho đến nay để tìm ra ở trên. Nó hoạt động tốt:

text.scan(/.._...._[0-9][0-9][0-9][0-9][0-9][0-9]/) 
puts text.uniq.sort.join(', ') 

Bây giờ tôi cần một regex sẽ tìm thấy ở trên có hoặc không có ký hiệu quốc gia hai chữ cái ở cuối. Ví dụ, tôi muốn để có thể tìm thấy tất cả ba trong số dưới đây:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

Tôi biết tôi có thể sử dụng hai hoặc ba quét khác nhau để đạt được kết quả của tôi, nhưng tôi m tự hỏi nếu có một cách để có được tất cả ba với một regex.

Trả lời

12
/.._...._[0-9][0-9][0-9][0-9][0-9][0-9](?:[A-Z][A-Z])?/ 

Bạn cũng có thể sử dụng {} để làm cho regex ngắn:

/.{2}_.{4}_[0-9]{6}(?:[A-Z]{2})?/ 

Giải thích: ? làm cho các mô hình trước tùy chọn. () biểu thức nhóm với nhau (vì vậy ruby ​​biết số ? áp dụng cho hai chữ cái). Các ?: sau khi mở ( làm cho nhóm không chụp (nhóm chụp sẽ thay đổi các giá trị mang lại bằng cách quét).

+0

hoạt động tốt, cảm ơn bạn và các phím tắt sẽ hữu ích. – michaelmichael

1
/.._...._\d{6}([A-Z]{2})?/ 
+1

Nếu bạn không thực hiện quét nhóm không chụp sẽ chỉ mang lại mã quốc gia (hoặc không cho các chuỗi không bao gồm một), không phải toàn bộ chuỗi đã được đối sánh. – sepp2k

1

Tại sao không chỉ sử dụng chia?

"AB_ABCD_123456".split(/_/).join(',') 

Xử lý các trường hợp bạn liệt kê mà không sửa đổi.

+0

AFAIK, OP đang cố gắng tìm danh sách các mã này ... không hoạt động chỉ với một mã. –

+1

Có; Tôi đã xem ví dụ và nhảy qua các chi tiết - một thói quen khủng khiếp. Xin lỗi vì sự nhầm lẫn. – ezpz

1

Hãy thử điều này:

text.scan(/\w{2}_\w{4}_\d{6}\w{0,2}/) 
#matches AB_ABCD_123456UK or ab_abcd_123456uk and so on... 

hoặc

text.scan(/[A-Z]{2}_[A-Z]{4}_\d{6}[A-Z]{0,2}/) 
# tighter, matches only AB_ABCD_123456UK and similars... 
# and not something like ab_aBCd_123456UK or ab_abcd_123456uk and similars... 

tham khảo các url:

Ruby gsub/regex modifiers?

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#regexp

nếu bạn muốn tìm hiểu thêm về regex.

+0

tôi thích ví dụ regex thứ hai đó. cảm ơn các liên kết. Tôi đã trải qua chúng, mặc dù không triệt để như tôi cần. các vấn đề thực tế trong cuộc sống giúp tôi hiểu rất nhiều. – michaelmichael

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