使用ReplaceAllString和ToUpper不工作

时间:2013-05-09 06:57:54

标签: go

我做错了什么?为什么ToUpper不起作用?

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {

    r := regexp.MustCompile("(\\w)(\\w+)")

    // Getting "sometext" instead of "SomeText"
    res := r.ReplaceAllString("some text", strings.ToUpper("$1") + "$2")

    fmt.Println(res)
}

2 个答案:

答案 0 :(得分:2)

您不能像我一样恐惧使用$1$2

我认为你正试图转变一些文字"进入" SomeText"。

Here is an alternative solution

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    r := regexp.MustCompile(`\s*\w+\s*`)
    res := r.ReplaceAllStringFunc("some text", func(s string) string {
        return strings.Title(strings.TrimSpace(s))
    })

    fmt.Println(res)
}

答案 1 :(得分:0)

strings.ToUpper("$1")似乎不起作用,因为输入不是您认为的那样。让我们将您的程序分解为更易读的方式,以揭示问题所在:

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {

    r := regexp.MustCompile("(\\w)(\\w+)")

    upper := strings.ToUpper("$1")  // upper == upcase("$1") == "$1"

    res := r.ReplaceAllString("some text", upper + "$2") // passing in "$1 $2"

    fmt.Println(res)
}

如您所见,当您致电$1时,strings.ToUpper尚未被替换。

不幸的是,你无法真正使用strings.ReplaceAllString来完成你想要做的事情,但是,正如Nick Craig-Wood在另一个答案中提到的那样,你可以使用strings.ReplaceAllStringFunc来{{3 }}