2

我做错了什么?为什么 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)
}
4

2 回答 2

2

恐怕你不能使用$1和喜欢那样!$2

我认为您正在尝试将“某些文本”转换为“某些文本”。

这是一个替代解决方案

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)
}
于 2013-05-09T07:16:10.277 回答
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完成所需的行为

于 2013-05-10T08:15:32.997 回答