2012-03-19 23 views
9

Trong Ruby, làm thế nào tôi có thể viết một regex để kiểm tra một trình cho một từ duy nhất?Ruby regex "chứa một từ"

Hãy tưởng tượng tôi có biểu mẫu web chấp nhận văn bản. Tôi biết nếu tôi muốn xem câu - chỉ-- có chứa "tham gia" tôi có thể sử dụng

if the_body == "join" 

Nhưng điều đó chỉ hoạt động nếu toàn bộ nội dung gửi là "tham gia".

Làm cách nào để tôi nhận được nội dung gửi như sau:

"Tôi muốn tham gia câu lạc bộ của bạn?" hoặc "Hãy tham gia cùng tôi"

Cảm ơn!

+4

Bạn cũng muốn bắt liên doanh ""? –

Trả lời

24

Bạn có thể làm điều đó với

string =~ /join/i 

hoặc

string.match(/join/i) 

Một cập nhật ít liên quan đến những nhận xét hiệu suất:

>> s = "i want to join your club" 
>> n = 500000 
=> 500000 
>> Benchmark.bm do |x| 
..  x.report { n.times { s.include? "join" } } 
.. x.report { n.times { s =~ /join/ } } 
.. end 
     user  system  total  real 
    0.190000 0.000000 0.190000 ( 0.186184) 
    0.130000 0.000000 0.130000 ( 0.135985) 

Trong khi sự chênh lệch tốc độ thực sự không quan trọng ở đây, phiên bản regex thực sự nhanh hơn.

+0

Ngoại trừ việc không cần phải thực hiện regex - có chi phí cao hơn so với tìm kiếm chuỗi đơn giản. – thomthom

+1

Bạn có chắc chắn về chi phí không? 'String # include?' Cuối cùng sử dụng thuật toán Rabin-Karp, có hiệu suất trường hợp xấu nhất của O (mn), trong khi đó một công cụ regex thích hợp có thể làm điều này trong O (n). –

+1

Vâng, đó là những gì tôi đã luôn luôn được kể. Mặc dù tôi đã không điều tra để xác minh nó - nghe có vẻ hợp lý. Vì vậy, không. Tôi không chắc. ;) – thomthom

0

Không cần Regexp ở đây - String#include? sẽ thực hiện công việc.

+0

Cảm ơn tất cả mọi người! – DougN

+0

Anh/cô ấy muốn một từ chính xác. – Ele

4

giải pháp đúng để tìm một WORD chính xác trong một chuỗi là

the_body.match(/\bjoin\b/i) hoặc sử dụng regex khác:

(\W|^)join(\W|$)

Xin lưu ý, chúng ta cần phải tìm xem "tham gia" WORD tồn tại hay không chuỗi. Tất cả các giải pháp trên sẽ thất bại đối với các chuỗi như: they are joining canals hoặc My friend Bonjoiny is a cool guy

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