2010-08-06 27 views
36

Hãy nói rằng tôi có một chuỗi tùy ý nhưTạo một biểu thức chính quy case-insensitive từ một chuỗi trong Ruby

`A man + a plan * a canal : Panama!` 

và tôi muốn thực hiện tìm kiếm regex cho chuỗi giống nhau ngoại trừ trường hợp. Đó là, biểu thức chính quy này phải phù hợp với chuỗi

`a man + A PLAN * a canal : PaNaMa!` 

Tôi mang nó cách tiếp cận tốt nhất là dấu chéo ngược-thoát khỏi tất cả các nhân vật với một ý nghĩa đặc biệt trong Ruby biểu thức thông thường, và sau đó làm Regexp.new với chuỗi đó và Regexp::IGNORECASE như các đối số . Có đúng không? Có biểu thức chính quy đã cố gắng và đúng sự thật để chuyển đổi chuỗi tùy ý thành nghĩa đen cụm từ thông dụng không?

Nhân tiện, cuối cùng tôi muốn sử dụng cụm từ thông dụng này để thực hiện truy vấn MongoDB không phân biệt dạng chữ. Vì vậy, nếu có một cách khác tôi có thể làm điều đó, xin vui lòng cho tôi biết.

Trả lời

40

Bạn có thể sử dụng Regexp.escape để thoát khỏi tất cả các ký tự trong chuỗi mà nếu không sẽ được xử lý đặc biệt bởi công cụ regexp.

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE) 

hoặc

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i") 
+0

Cảm ơn, đó chỉ là những gì tôi đang tìm kiếm! (Mặc dù như MongoDB, tôi nhận ra rằng nếu tôi đang thực hiện loại tìm kiếm này thường xuyên, tôi thực sự nên lưu trữ một phiên bản xuống của chuỗi vì lý do hiệu suất.) –

22

Nếu bạn biết biểu thức chính quy bạn muốn rồi, bạn có thể thêm "i" sau khi biểu thức (ví dụ /the center cannot hold it is too late/i) để làm cho nó case insensitive.

+3

Đúng, nhưng đó không phải là câu hỏi tôi đang hỏi. Tôi có một chuỗi tùy ý (từ đầu vào của người dùng), không phải là một biểu thức chính quy. Nếu người dùng nhập 'a + b', ví dụ, tôi muốn có thể tìm thấy' A + b', 'a + B' hoặc' A + B', không phải 'aaaaab'. –

6

Một hơi nhiều cú pháp-có đường cách để làm điều này là sử dụng các ký hiệu %r cho literals biểu thức chính quy:

input_str = "A man + a plan * a canal : Panama!" 
%r(#{Regexp.escape(input_str)})i 

Tất nhiên nó đi xuống đến sở thích cá nhân.

37

Ruby regexes có thể nội suy các biểu thức theo cùng cách mà các chuỗi làm, sử dụng ký hiệu #{}. Tuy nhiên, bạn phải thoát khỏi bất kỳ ký tự đặc biệt regex nào. Ví dụ:

input_str = "A man + a plan * a canal : Panama!" 
/#{Regexp.escape input_str}/i 
+2

Đây là một câu trả lời tuyệt vời - nó đọc tốt hơn so với phản hồi bình chọn hàng đầu và cảm thấy giống Ruby hơn khi tôi khởi động. Hy vọng những người khác sẽ upvote này quá .. –

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