Tôi cần thay thế giá trị của một chuỗi thành biểu thức chính quy của tôi trong Ruby. Có cách nào làm dễ hơn không? Ví dụ:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Tôi cần thay thế giá trị của một chuỗi thành biểu thức chính quy của tôi trong Ruby. Có cách nào làm dễ hơn không? Ví dụ:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Câu trả lời:
Tương tự như chèn chuỗi.
if goo =~ /#{Regexp.quote(foo)}/
#...
Lưu ý rằng Regexp.quote
trong câu trả lời Jon L. của là quan trọng!
if goo =~ /#{Regexp.quote(foo)}/
Nếu bạn chỉ làm phiên bản "rõ ràng":
if goo =~ /#{foo}/
sau đó các dấu chấm trong văn bản đối sánh của bạn được coi là ký tự đại diện regrec và "0.0.0.0"
sẽ khớp "0a0b0c0"
.
Cũng lưu ý rằng nếu bạn thực sự chỉ muốn kiểm tra sự phù hợp của chuỗi con, bạn có thể chỉ cần làm
if goo.include?(foo)
mà không yêu cầu trích dẫn thêm hoặc lo lắng về các ký tự đặc biệt.
.quote()
) cũng có thể hữu ích nếu bạn đang tìm cách xây dựng một biểu thức chính quy bằng chuỗi.
if goo.include?(foo)
" => Đúng khi bạn quan tâm đến việc kiểm tra sự tồn tại. Nếu bạn quan tâm đến việc thay thế và đã sử dụng String.gsub, thì Regapi.quote có thể là lựa chọn duy nhất của bạn.
Regexp.new
hoặc Regexp.compile
.
Regexp.compile(Regexp.escape(foo))
Sử dụng RegEx.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Đây là một câu trả lời hạn chế nhưng hữu ích khác:
Tôi phát hiện ra rằng tôi có thể dễ dàng chèn vào regex mà không cần sử dụng Regapi.quote hoặc Regapi.escape nếu tôi chỉ sử dụng dấu ngoặc đơn trên chuỗi đầu vào của mình: (khớp địa chỉ IP)
IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0")
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"
trích dẫn duy nhất chỉ giải thích \ và \ '.
http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes
Điều này giúp tôi khi tôi cần sử dụng cùng một phần dài của biểu thức chính quy nhiều lần. Không phổ quát, nhưng phù hợp với ví dụ câu hỏi, tôi tin.
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/