我正在尝试处理 Markdown 文件,替换所有图像 url。 markdown 图片 url 的格式是 
我的正则表达式搜索找到第一个,返回位置并替换它,然后我循环浏览文档直到我的正则表达式搜索没有找到任何 - 即它的匹配维度数组为空。
问题是出于某种原因它继续匹配“我不完全知道是什么”。即从正则表达式搜索返回的数组的长度永远不会为 0
location := split[:locationSplit]
bodyRe := regexp.MustCompile(`!\[(.*)\]\((.*)\)`)
indexes := bodyRe.FindStringIndex(body)
fmt.Println("location: ", absoluteFileLocation)
fmt.Println("length: ", indexes)
for len(indexes) != 0 {
fmt.Println("length: ", len(indexes))
imageLocation := body[indexes[0]:indexes[1]]
body = body[:indexes[0]] + imageLocation + body[indexes[1]:]
indexes = indexes[:0]
fmt.Println("length: ", len(indexes))
indexes = bodyRe.FindStringIndex(body)
}
这会返回一个连续的:
length: 2
length: 0
length: 2
length: 0
length: 2
length: 0
length: 2
length: 0
length: 2
2 来自循环内的 indexes = bodyRe.FindStringIndex(body) 行,因为我之前将索引设置为 0。
感谢帮助
编辑:根据要求进行编辑,例如包括在内。上面的方法明显有问题,下面这个方法对第一张图有效,对后面的就不行
所以我尝试了这种技术:
(样本 Markdown 文件)
some markdown

more markdown

more markdown & end of document
和修改后的代码:
...
...
bodyRe := regexp.MustCompile(`!\[(.*)\]\((.*)\)`)
indexes := bodyRe.FindAllStringSubmatchIndex(body, -1)
for _, j := range(indexes) { //i is the index, j is the element (in this case j = []int )
imageLocation := body[j[4]:j[5]]
body = body[:j[4]] + "/App/Image/?image=" + location + "/" + imageLocation + body[j[5]:]
}
return body
(需要输出markdown)
some markdown

more markdown

more markdown
end of document
这适用于第一张图片。但不是第二个。问题是(我认为当该方法循环并替换第一个方法时,正文中的索引(即 body[j[4]:j[5]])发生变化,因此它替换了第二个放错地方了。
我需要这样做,以便在最终呈现 markdown 时,图像 url 指向可以提供它们的地方。
编辑:固定
谢谢大家。 由于人们很难理解我想做什么,我怀疑我正在以一种奇怪的方式解决这个问题。我已经让它工作了,下面是适用于任何其他调查此问题的代码片段。
首先我会解释我遇到问题的原因。 我想将网站的博客写作与网站本身的实际维护分开。因此,“博客作者”被告知用 markdown 编写博客,所有图像标签都采用 ` 格式,其中所有图像必须与 markdown 文件本身位于同一目录中。 因为这个目录不是网站本身代码库的一部分,所以图片 url 需要替换为绝对 url,这样它们才能被提供。我不希望这是博客作者需要担心的事情。
第一张图片一切正常,但是因为替换的绝对 URL 改变了长度,因此改变了博客内容中所有字符的位置,正则表达式找到的索引不再对齐,所以我不得不添加匹配索引的新长度。
adjustment := 0
for _, j := range(indexes) {
imageLocation := body[j[4]+adjustment:j[5]+adjustment]
replacement := "?imageurl=" + url.QueryEscape(location) + "/" + imageLocation
body = body[:j[4] + adjustment] + replacement + body[j[5] + adjustment:]
adjustment += len(replacement) - len(imageLocation)
}
最佳答案
在这一行之后:
imageLocation := body[indexes[0]:indexes[1]]
imageLocation 将包含类似  的字符串。
body = body[:indexes[0]] + imageLocation + body[indexes[1]:]
在该行之后,正文将与之前相同。您基本上是用 3 个片段重建它。
这相当于做 the following :
package main
import "fmt"
func main() {
s := "Hello, playground"
t := s[2:4]
s = s[:2] + t + s[4:]
fmt.Println(s) // prints "Hello, playground"
}
在下一次迭代中,将再次找到最左边的相同匹配项,永无止境。
您是否阅读了 FindStringIndex 的文档? ?
如果您编辑您的问题以说明您正在尝试做什么,我可以为您提供一个有效的代码片段。
关于golang 中所有 url 的 Markdown url 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329930/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.