当前位置: 首页 > 知识库问答 >
问题:

用于在golang中所有url上标记url的正则表达式

浦德义
2023-03-14

我正在尝试通过一个降价文件,替换所有的图像URL。降价图像url的格式是![备选名称](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来自index=body Re行。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中的索引(即body[j[4]:j[5]])会发生变化,因此它会在错误的位置替换第二个。

我需要这样做,当标记最终呈现时,图像URL指向可以提供服务的地方。

编辑:修正

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

首先,我会解释为什么我会有这个问题。我想把为一个网站写博客与网站本身的实际维护分开。因此,“博客作者”被要求以降价方式写博客,所有图像标签的格式为“所有图像必须与降价文件本身位于同一目录中”。因为这个目录不是网站本身的代码库的一部分,所以图像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个答案

丁振海
2023-03-14

在这一行之后:

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

imageLocation将包含一个类似的字符串![图片](anImage.png)

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

在这条线之后,身体会和以前一样。你基本上是用三个片段重建它。

这相当于执行以下操作:

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的文档?

如果你编辑你的问题来说明你想做什么,我可以为你提供一个有效的代码片段。

 类似资料:
  • 我有一个表单,它有一个输入字段,只要求一个有效的youtube url,没有逗号分隔的youtube url。我使用以下正则表达式验证youtube url的用户输入: 但如果用户输入逗号分隔的有效youtube链接,这些正则表达式就会失败。 我想要一个正则表达式,simpy只允许在输入字段中有一个有效的youtube链接。有人能在这方面帮我吗,因为我对regex还不熟悉? 例如: https:/

  • 问题内容: 有人有用于验证网址的正则表达式(不是在文本段落中找到它们)吗?最好使用JavaScript代码段。 问题答案: 实际的URL语法非常复杂,并且很难在正则表达式中表示。那里大多数看起来简单的正则表达式都会给出许多错误的否定和错误的肯定,但即使最终的结果并不好。 加上这些天,您通常都希望允许使用IRI和老式的URI,因此我们可以链接到有效地址,例如: 我只会做简​​单的检查:它是否以一个已

  • 我试图在正则表达式中组合if-else,基本上,如果字符串中存在一些模式,则捕获一个模式,如果不存在,则捕获另一个模式。 字符串是:'https://www.searchpage.com/searchcompany.aspx?companyId=41490234 因此,如果在字符串中检测到“?”,则正则表达式应捕获“?”标记之后的所有内容;如果没有,那就从头抓起。 我使用了:

  • 问题内容: 我一直在寻找URL的简单正则表达式,有人能用得起吗?我在zend框架验证类中找不到一个,并且看到了几种实现。 问题答案: 我在一些项目中使用了此工具,我不认为我遇到了问题,但我敢肯定它并不详尽: 最后,大多数随机垃圾都是用来处理句子中的情况(以避免匹配尾随时间)。我敢肯定它可以清除,但因为它起作用了。我或多或少只是将其复制到项目之间。

  • 问题内容: 我实现了如下所示的Pattern类:http : //www.java2s.com/Code/Java/GWT/ImplementjavautilregexPatternwithJavascriptRegExpobject.htm 我想使用以下正则表达式来匹配我的String中的网址: 不幸的是,Java编译器当然无法解析该字符串,因为它不使用有效的转义序列(因为从技术上讲,以上是Ja

  • 问题内容: 在使用正则表达式时,我使用RegexBuddy。我从其库中复制了正则表达式以匹配URL。我在RegexBuddy中成功测试。但是,当我将其复制为Java 样式并将其粘贴到Java代码中时,它将无法正常工作。以下类打印: 有人知道我在做什么错吗? 问题答案: 请尝试以下正则表达式字符串。你的测试可能以区分大小写的方式进行。我添加了小写字母Alpha以及正确的字符串开头占位符。 这也适用: