替换以&#34开头的特定新行; #"在GO

时间:2014-05-13 11:08:08

标签: regex go markup

我是GO的新手,我有点困惑。我不知道我做错了什么。

我想将markdown转换为html,所以我需要找到以space和#开头的每一行,并用h1标签替换。

如果我测试多行它不起作用,但当我只测试一行时,它正在工作。

示例:

//this works
    testtext := "#Some text"
    expectedResult := "<h1>Some text</h1>"

//this fails
    testtext :=`#test
                ##test2
                ####test4
                ###test3`
    expectedResult := `<h1>test</h1>
                       ##test
                       ####test
                       ###test`
//test
    func TestReplaceHedding1(t *testing.T) {
        text := `#test
                ##test2
                ####test4
                ###test3`
        replaceHedding1(&text)

        if text != "<h1>test</h1>##test\n####test\n###test" {
            t.Errorf("expected <h1>test</h1>, got", text)
        }
    }

    func replaceHedding1(Text *string) {
        reg := regexp.MustCompile(`^\s*#{1}(.*?)$`)
        *Text = reg.ReplaceAllString(*Text, "<h1>$1</h1>")
    }

1 个答案:

答案 0 :(得分:4)

好吧,你的正则表达式应该更像这样:

(?m)^\s*#([^#].*?)$

(?m)使^$分别匹配每行的开头和结尾,因为否则,它们会匹配字符串的开头和结尾(我也删除了{1}因为它是多余的。)

然后我在捕获组中添加了[^#],以确保第一个#之后的下一个字符不是另一个#

我还更改了测试字符串,并使用了双引号和\n,因为当您使用反引号时,#之前的空格将成为字面值,而if将随后失败。这是playground for go where I have tested the code