红宝石,GSUB和正则表达式
-
18-09-2019 - |
题
快速背景:我有一个包含到其他页面引用的字符串。该页面链接到使用以下格式:“#12”。哈希随后页的ID。
说我有以下字符串:
str = 'This string links to the pages #12 and #125'
我已经知道的页面是需要链接的ID:
page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
我遍历网页ID和如何链接的#12,#125,以各自的网页?我碰到的问题是,如果我这样做(在轨):
page_ids.each do |id|
str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
此工作正常#12,但它的#125中的“12”部分12的ID链接到的页面。
任何帮助将是真棒。
解决方案
如果您的索引总是在字边界结束,您可以匹配:
page_ids.each do |id|
str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end
您只需要添加搜索模式的字边界符号\b
,这是没有必要的替换模式。
其他提示
除了第一提取ID,然后替换它们,你可以简单地找到和一气呵成替换它们:
str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }
因为即使你需要的ID其他地方,以及你不能离开了提取步骤,这应该是更快,因为它并没有去通过每个ID整个字符串。
PS:如果str
不是从其他地方提到,你可以使用str.gsub!
代替str = str.gsub
不隶属于 StackOverflow