루비, Gsub 및 Regex
-
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"부분을 ID가 12 인 페이지에 연결합니다.
모든 도움은 굉장 할 것입니다.
해결책
인덱스가 항상 단어 경계로 끝나면 다음과 일치 할 수 있습니다.
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에 대한 전체 문자열을 통과 할 필요가 없기 때문에 훨씬 더 빠릅니다.
추신 : if str
다른 곳에서는 언급되지 않으므로 사용할 수 있습니다. str.gsub!
대신에 str = str.gsub
제휴하지 않습니다 StackOverflow