golang

时间:2015-07-09 23:17:19

标签: regex go infinite-loop

我正在尝试通过降价文件,替换所有图片网址。降价图片网址的格式为![alternative name](imageurl.png)

我的正则表达式搜索找到第一个,返回位置并替换它,然后我遍历文档直到我的正则表达式搜索找不到任何 - 即它的匹配维度数组为空。

问题是由于某种原因它继续匹配"我不知道是什么"。即,从正则表达式搜索返回的数组的长度永远不会为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。

帮助表示赞赏

编辑:由于包含示例请求而编辑。上述方法显然存在缺陷,以下方法适用于第一张图像,但不适用于下一张图像

所以我尝试了这种技术:

(样本降价文件)

some markdown

![image](anImage.png)

more markdown

![image2](anImage2.png)

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

(所需的输出降价)

some markdown

![image](/App/Image/?image=[location]/anImage.png)

more markdown

![image2](/App/Image/?image=[location]/anImage2.png)

more markdown
end of document

这适用于第一张图片。但不是第二个。问题是(我认为当该方法循环并替换第一个时,正文中的索引(即body[j[4]:j[5]])会发生变化,因此它会在错误的位置替换第二个。

我需要这样做,以便在最终渲染降价时,图片网址指向可以从中提供服务的地方。

编辑:已修复

谢谢你们。 由于人们很难理解我想做什么,我怀疑我是以一种奇怪的方式解决问题。我已经有了它的工作,下面是代码片段,适用于任何其他人正在研究这个。

首先,我将解释我遇到问题的原因。 我想从网站本身的实际维护中分离出一个网站的博客文章。因此,博客作者'被告知在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)
}

1 个答案:

答案 0 :(得分:0)

这一行之后:

imageLocation := body[indexes[0]:indexes[1]]

imageLocation将包含类似![image](anImage.png)的字符串。

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"
}

在下一次迭代中,将再次找到相同的最左侧匹配,ad perpetuum。

您是否阅读了FindStringIndex的文档?

如果您编辑问题以说出您尝试做的事情,我可以为您提供有效的代码段。