Nội suy một chuỗi thành regex


160

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

Bạn đang cố gắng để xem nếu foo là một chuỗi con của goo? Tôi không nghĩ nó rõ ràng những gì bạn đang hỏi.
Neall

Nếu vậy, goo.include? (Foo) là đủ!
glenn mcdonald

1
Không, tôi đã không thử xem foo có phải là một chuỗi con của goo không; Tôi cũng cần phải thực hiện một số chụp, do đó bao gồm không hoạt động.
Chris Bunch

Câu trả lời:



125

Lưu ý rằng Regexp.quotetrong 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.


3
Lưu ý rằng điều ngược lại (không sử dụng .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.
Jesse

"Nếu bạn thực sự chỉ muốn kiểm tra sự phù hợp của chuỗi con, bạn chỉ cần thực hiện 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.
Isaac Betesh

Chỉ cần thêm vào Jesse trong trường hợp không rõ ràng, điều này có nghĩa là chỉ cần chuyển chuỗi ký tự mà bạn không cần phải thoát Regexp.newhoặc Regexp.compile.
dylankb

Cảm ơn bạn đã giải thích hữu ích về lý do tại sao chúng tôi có thể muốn sử dụng Regapi.quote
Wylliam Judd

7

Có lẽ Regexp.escape(foo)sẽ là một điểm khởi đầu, nhưng có một lý do chính đáng để bạn không thể sử dụng phép nội suy biểu thức thông thường hơn : "my stuff #{mysubstitutionvariable}"?

Ngoài ra, bạn chỉ có thể sử dụng !goo.match(foo).nil?với một chuỗi chữ.




3

Đâ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.


Tôi tò mò những gì sẽ được nghĩ về bài viết của tôi ở đây, nhưng tôi nghi ngờ nó sẽ được nhìn thấy cho đến nay ở đây.
Plasmarob

-2
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/

2
Không, điều này sẽ đưa ra một "sự thật" sai lầm cho "đây là một số thứ khác 070x0! 0", bởi vì các dấu chấm là các ký tự đại diện regrec.
glenn mcdonald
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.