Chuyển đổi một chuỗi thành ruby ​​biểu thức chính quy


118

Tôi cần chuyển đổi chuỗi như "/ [\ w \ s] + /" thành biểu thức chính quy.

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

Tôi đã thử sử dụng các Regexpphươ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 dấu gạch chéo ngược:

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

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

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

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

Câu trả lời:


149

Có vẻ như ở đây bạn cần chuỗi đầu tiên nằm trong dấu nháy đơn (tham khảo trang này )

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

137

Để rõ ràng

  /#{Regexp.quote(your_string_variable)}/

cũng đang làm việc

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


3
Chỉ phát hiện ra rằng bạn không thể nối các tùy chọn theo cách đó, chẳng hạn như /#{your_regex}/#{options}.
pduersteler

Tôi cho rằng bạn đang nói về Rails? optionslà một Hash, và Ruby không quá động =)
Sergey Gerasimov

2
Điều này không thực hiện những gì OP đang yêu cầu trên Ruby 2.1, nó chuyển đổi "[\ w \ s] +" => / [w] + /
Luca Spiller

1
Hãy lưu ý rằng câu trả lời đã được đưa ra vào năm 2012 năm :) Lúc đó tất cả mọi thứ đã được hoàn hảo
Sergey Gerasimov

4
Đó là một năm hoàn hảo.
Naftuli Kay

35

Phương thức này sẽ thoát một cách an toàn tất cả các ký tự có ý nghĩa đặc biệt:

/#{Regexp.quote(your_string)}/

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

Hãy nhớ sử dụng một chuỗi được trích dẫn đơ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.


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 thực hiện những gì OP đang yêu cầu trên Ruby 2.1, nó chuyển đổi "[\ w \ s] +" => / [w \] \ + /
Luca Spiller

@LucaSpiller bạn cần sử dụng một chuỗi được trích dẫn đơn, dấu gạch chéo ngược được coi như một ký tự đặc biệt trong 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'không phải.
sandstrom

8

Sử dụng ký hiệu%:

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

hoặc là

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

Từ sự trợ giúp :

% r [] Regexp nội suy (cờ có thể xuất hiện sau dấu phân cách đóng)


Điều này không thực hiện những gì OP đang yêu cầu trên Ruby 2.1, nó chuyển đổi "[\ w \ s] +" => / [ws] + /
Luca Spiller

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

5

Gem 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 công cụ sửa đổi:

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

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

'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/}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.