为什么我的正则表达式不匹配并替换字符串以便将代码urlencode成为新字符串?

时间:2018-11-01 17:22:10

标签: regex go

我正处于困境,不明白为什么会有问题。它应与“ -_”的正则表达式匹配,并替换为“%/”。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    rewrittenUrl := "https://rewriteurls.com/v2/url?u=https-3A__www.youtube.com_watch-3Fv-3D4RkZAfD-2JHeM&d=DwMFaQ&c=SiTLKJfsN-8Sb-MxLIXcbA&r=LqnK821DYMk9rZdGgNQw73sPqZUvbX2xxnSU9Ro3lk8&m=Qq7De43ipEDY9RFTKIoH6VpjqxPwG1AHvfT51Oh-Sw4&s=2fNNjfWFIBBgYVuwxvVOAabxmcBqWXfzvQgU7zxduxg&e="

    r, _ := regexp.Compile("u=(.+?)&[dc]=")
    m := r.FindString(rewrittenUrl)

    // Will print u=https-3A__www.youtube.com_watch-3Fv-3D4RkZAfD-2DHeM&d=
    fmt.Print(m)

    // This attempt did not work either...
    // res := strings.Replace(m, "-_", "%/", 1)

    fmt.Println(m)

    // TO DO
    // match in  out '-_', '%/'
    r2, _ := regexp.Compile("(-_)")
    // Desired outcome u=https%3A//www.youtube.com/watch%3Fv%3D4RkZAfD%2DHeM&d=
    fmt.Printf("%q\n", r2.ReplaceAllString(m, "%/"))
}

1 个答案:

答案 0 :(得分:1)

第一部分显然可以按预期工作,因此您实际上要问的是如何转换字符串,如:

"u=https-3A__www.youtube.com_watch-3Fv-3D4RkZAfD-2JHeM&d="

放入类似

的字符串中
"u=https%3A//www.youtube.com/watch%3Fv%3D4RkZAfD%2JHeM&d="

这很简单,不需要正则表达式...

m2 := strings.Replace(m, "-", "%", -1)
m2 = strings.Replace(m2, "_", "/", -1)

desired := "u=https%3A//www.youtube.com/watch%3Fv%3D4RkZAfD%2JHeM&d="

if m2 == desired {
    fmt.Printf("        success: %q\n", m2)
} else {
    fmt.Println("fail!")
}

这里正在起作用:https://play.golang.org/p/yWCJz7jTw2l