2011-07-15 25 views
5

Làm cách nào để thử nghiệm đối sánh chính xác bằng cách sử dụng regex.Sử dụng regex để tìm đối sánh mẫu chính xác trong Ruby

"car".match(/[ca]+/) trả về giá trị đúng.

Làm cách nào để nhận được câu lệnh trên trả về false vì mẫu regex không chứa "r"? Bất kỳ chuỗi nào chứa bất kỳ ký tự nào khác hơn "c" và "a" sẽ trả về false.

"acacaccc" nên trở thành sự thật

"acacacxcc" nên trả về false

Trả lời

9

Thêm một số neo với nó:

/^[ca]+$/ 
+2

Số: '" c \ nX ".match (/^[ca] + $ /)'. –

+0

Neo này không chính xác. Xin vui lòng xem bình luận cho câu trả lời của Chris Heald. – skalee

6

Bạn chỉ cần neo.

"car".match(/^[ca]+$/) 

Điều này sẽ buộc toàn bộ chuỗi phải bao gồm "c" hoặc "a", vì "^" và "$" có nghĩa là "bắt đầu" và "kết thúc" của chuỗi. Nếu không có chúng, regex sẽ thành công miễn là nó khớp với bất kỳ phần nào của chuỗi.

+2

Điều này vi phạm các chuỗi như "" caca \ nrabbits "'. Các neo thích hợp sẽ là '\ A' và' \ Z' – cam

+4

@cam: Trên thực tế bạn muốn '\ z', không phải' \ Z', hoặc bạn sẽ bỏ lỡ '" c \ n "'. –

+0

@mu quá ngắn: điểm tốt, cảm ơn. – cam

0

thử này

"car".match /^(a|c)+$/ 
3

Rẽ logic của bạn xung quanh và tìm kiếm những điều xấu:

string.match(/[^ca]/) 
string.index(/[^ca]/) 

Nếu một trong hai điều trên đều là phòng không bằng không, sau đó bạn có một chuỗi xấu. Nếu bạn chỉ muốn thử nghiệm và không quan tâm về nơi nó phù hợp thì:

if string.index(/[^ca]/).nil? 
    # You have a good string 
else 
    # You have a bad string 

Ví dụ:

>> "car".index(/[^ca]/).nil? 
=> false 
>> "caaaacaac".index(/[^ca]/).nil? 
=> true 
1

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

"car".match(/^(?:c|a)$/) 
Các vấn đề liên quan