2011-12-28 27 views
91

Tôi cần chuyển đổi chuỗi như "/ [\ w \ s] + /" thành cụm từ thông dụng.Chuyển đổi chuỗi thành cụm từ thông dụng ruby ​​

"/[\w\s]+/" => /[\w\s]+/ 

tôi đã cố gắng sử dụng Regexp phương pháp khác nhau như:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, tương tự Regexp.compileRegexp.escape. Nhưng không ai trong số họ trở lại như tôi mong đợi.

Hơn nữa, tôi đã thử xóa các dấu gạch chéo ngược:

Regexp.new("[\w\s]+") => /[w ]+/ Nhưng không có may mắn.

Sau đó, tôi đã cố gắng để làm cho nó đơn giản:

str = "[\w\s]+" 
=> "[w ]+" 

Nó thoát. Bây giờ làm thế nào chuỗi có thể vẫn còn như nó và chuyển đổi sang một đối tượng regexp?

Trả lời

111

Hình như ở đây bạn cần chuỗi ban đầu là trong dấu nháy đơn (tham khảo this page)

>> str = '[\w\s]+' 
=> "[\\w\\s]+" 
>> Regexp.new str 
=> /[\w\s]+/ 
115

Để được rõ ràng

/#{Regexp.quote(your_string_variable)}/ 

đang làm việc quá

chỉnh sửa: bọc your_string_variable trong Regexp.quote, cho đúng đắn.

+2

Chỉ cần phát hiện ra rằng bạn _can't_ thêm tùy chọn theo cách đó, như '/ # {your_regex}/# {options}'. – pduersteler

+0

Tôi cho rằng bạn đang nói về Rails? 'options' là một Hash, và Ruby không phải là soooo dynamic =) –

+0

Ah, vâng. Tôi đã thử đi qua "ix" với nó :) – pduersteler

33

Phương pháp này sẽ an toàn thoát khỏi tất cả các ký tự với ý nghĩa đặc biệt:

/#{Regexp.quote(your_string)}/ 

Ví dụ, . sẽ được thoát, vì nó khác hiểu là 'bất kỳ ký tự'.

Hãy nhớ sử dụng chuỗi được trích dẫn một lần trừ khi bạn muốn nội suy chuỗi thông thường bắt đầu, trong đó dấu gạch chéo ngược có ý nghĩa đặc biệt. % Ký hiệu

+2

Tốt vì nó giải thích cách chúng ta có thể bảo vệ biến chuỗi có thể chứa các dấu hiệu (chẳng hạn như '+ .') sẽ được diễn giải trong Regexp. – rchampourlier

+1

Điều này không làm những gì OP được yêu cầu trên Ruby 2.1, nó chuyển đổi "[\ w \ s] +" =>/\ [w \ \] \ +/ –

+0

@LucaSpiller bạn cần phải sử dụng một chuỗi trích dẫn đơn, dấu gạch chéo ngược được coi là một ký tự đặc biệt trong các chuỗi được trích dẫn kép, đó là lý do tại sao ví dụ '" \ n "' là một dòng mới nhưng ''\ n'' thì không. – sandstrom

5

Sử dụng:

%r{\w+}m => /\w+/m 

hoặc

regex_string = '\W+' 
%r[#{regex_string}] 

Từ help:

% r [] suy biểu thức chính quy (cờ có thể xuất hiện sau khi kết thúc delimiter)

+0

Điều này không làm những gì OP yêu cầu trên Ruby 2.1, nó chuyển đổi "[\ w \ s] +" =>/[ws] +/ –

+0

@Luca Spiller, cảm ơn, dấu nháy đơn nên được sử dụng ở đó, tôi sẽ cập nhật câu trả lời. – BitOfUniverse

2

Đá quý to_regexp có thể thực hiện công việc.

"/[\w\s]+/".to_regexp => /[\w\s]+/ 

Bạn cũng có thể sử dụng modifier:

'/foo/i'.to_regexp => /foo/i 

Cuối cùng, bạn có thể lười biếng hơn sử dụng: phát hiện

'foo'.to_regexp(detect: true)  #=> /foo/ 
'foo\b'.to_regexp(detect: true) #=> %r{foo\\b} 
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b} 
'foo\b/'.to_regexp(detect: true) #=> %r{foo\\b/} 
Các vấn đề liên quan