2012-03-29 27 views
17

Tôi đang sử dụng cụm từ thông dụng sau đây để march href trên trang web.Có thể tạo cụm từ thông dụng động trong Ruby

\/static\/workout\/[A-Z]{1,4}032812[A-Z]{1,5}-EQB.html 

Tôi muốn tìm cách tạo phần 032812 của động từ biểu thức chính quy, sao cho giá trị sẽ phản ánh ngày hiện tại. Fore Ví dụ, trên 31 Tháng Ba 2012 các biểu thức chính quy sẽ trông như thế:

\/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

tôi đã cố gắng tạo ra một chuỗi

a = \/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

và sau đó

\ a \ 

nhưng điều này đã không làm việc. Có cách nào để làm điều này.

Trả lời

52

Bạn có thể sử dụng #{} giống như trong một chuỗi.

1.9.2p290 :001 > some_string = "033112" 
=> "033112" 
1.9.2p290 :002 > a_regex = /[A-Z]{1,4}#{some_string}[A-Z]{1-5}-EQB.html/ 
=> /[A-Z]{1,4}033112[A-Z]{1-5}-EQB.html/ 
+0

Cảm ơn! Tôi đang đá chính mình vì không tìm ra được điều đó. cảm ơn một lần nữa, đánh giá cao sự giúp đỡ của bạn. – Mutuelinvestor

+0

Tính năng này có hoạt động ở ruby ​​2.2.0 không? – MC2DX

+1

@ MateuszCzerwiński Điều này làm việc trong Ruby 2.2, nhưng bạn nên cẩn thận nếu biến có thể chứa các ký tự regex, hãy xem xét sử dụng '# {Regexp.quote (some_string)}' trong '/.../'. – TWiStErRob

12

Tôi hoàn toàn ủng hộ giải pháp Isaac, nhưng bạn cũng có thể:

a = "\/static\/workout\/[A-Z]{1,4}" + "033112" + "[A-Z]{1,5}-EQB.html" 
regex = Regexp.new(a) 
stringtomatch =~ regex 
+0

Vì vậy, nó sẽ là một cái gì đó như b = Regexp.new (a) và sau đó/b/để thực hiện trận đấu. – Mutuelinvestor

+0

Tôi sẽ chỉnh sửa câu trả lời của mình. Nó cũng có thể giúp bạn đặt câu trả lời của Isaac vào đúng ánh sáng. –

+3

Để thêm vào đó, bạn nên suy nghĩ về '/' trong regexes theo cách bạn nghĩ về ''' cho chuỗi: nó cho phép bạn thể hiện một regex bằng chữ của một số văn bản. là một quá trình riêng biệt mà không quan tâm nhiều cho dù regex đến từ một chữ hoặc một số cách khác để tạo ra regexes.Vì vậy, lấy một chuỗi và biến nó thành một regex và sau đó áp dụng nó không liên quan đến bất kỳ slashes, cũng giống như tham gia một đối tượng, gọi 'to_s' trên đó và sau đó in chuỗi đó không yêu cầu bất kỳ dấu ngoặc kép nào. Ví dụ của tôi ở trên chỉ là một chữ tượng trưng, ​​vì vậy nó hoàn toàn khác. –

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