Tôi muốn chuyển đổi văn bản sau đâyThay regex phần phù hợp tại chỗ với Ruby
This is a ![foto](foto.jpeg), here is another ![foto](foto.png)
vào
This is a ![foto](/folder1/foto.jpeg), here is another ![foto](/folder2/foto.png)
Nói cách khác tôi muốn tìm tất cả các đường dẫn hình ảnh được kèm theo trong ngoặc đơn (văn bản nằm trong cú pháp Markdown) và thay thế chúng bằng các đường dẫn khác. Chuỗi chứa đường dẫn mới được trả về bởi hàm real_path
riêng biệt.
Tôi muốn thực hiện việc này bằng cách sử dụng String#gsub
trong phiên bản chặn của nó. Hiện nay mã của tôi trông như thế này:
re = /!\[.*?\]\((.*?)\)/
rel_content = content.gsub(re) do |path|
real_path(path)
end
Vấn đề với regex này là nó sẽ phù hợp ![foto](foto.jpeg)
thay vì chỉ foto.jpeg
. Tôi cũng đã thử các regexen khác như (?>\!\[.*?\]\()(.*?)(?>\))
nhưng không có kết quả.
Giải pháp hiện tại của tôi là chia nhỏ đường dẫn và lắp ráp lại sau.
Có một regex Ruby chỉ khớp với đường dẫn bên trong dấu ngoặc và không phải tất cả các ký tự bắt buộc theo ngữ cảnh không?
Cập nhật sau câu trả lời: Vấn đề chính ở đây là regexen của Ruby không có cách nào để chỉ định lookbehinds không có chiều rộng. Giải pháp chung nhất là nhóm các phần của regexp trước và phần sau phần khớp thực, tức là /(pre)(matching-part)(post)/
và tạo lại chuỗi đầy đủ sau đó.
Trong trường hợp này các giải pháp sẽ được
re = /(!\[.*?\]\()(.*?)(\))/
rel_content = content.gsub(re) do
$1 + real_path($2) + $3
end
Có lẽ ý tưởng tốt nhất là, như bạn đề nghị, để tiết kiệm phần trước và sau khi trận đấu thực sự trong nhóm riêng biệt và xây dựng lại chuỗi cuối cùng với '$ 1 + real_path ($ 2) + $ 3'. – gioele