我在围棋中编写了一个清理单个单词的函数,这样每个单词的开头和结尾的特殊字符都会被删除.

即:

  • -你好,->你好
  • 《背靠背》-&>背靠背

最后得到了以下结果,通过逐个字母地判断它们是否属于独脚码.Letter set,这很好用,但我想知道是否有更好或更有效的方法来做到这一点?我try 了字符串.TrimLeft/Right,但然后我必须定义我自己的一组要删除的字符.如果使用预定义的集合将会很好.

func TrimWord(word []rune) string {
    var prefix int = 0
    var suffix int = len(word)

    for x := 0; x < len(word); x++ {
        if !unicode.IsLetter(word[x]) {
            prefix++
        } else {
            break
        }
    }

    for x := len(word) - 1; x >= 0; x-- {
        if suffix == prefix {
            break
        }
        if !unicode.IsLetter(word[x]) {
            suffix--
        } else {
            break
        }
    }
    return string(word[prefix:suffix])
}

推荐答案

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func trimWord(s string) string {
    return strings.TrimFunc(s, func(r rune) bool {
        return !unicode.IsLetter(r)
    })
}

func main() {
    fmt.Println(trimWord(`.-hello,`))       // -> hello
    fmt.Println(trimWord(`"back-to-back"`)) // -> back-to-back
}

https://go.dev/play/p/l1A4hBDvFfr

hello
back-to-back

Package strings

func TrimFunc(s string, f func(rune) bool) string

TrimFunc返回字符串s的片段,其中删除了满足f(C)的所有前导和尾随Unicode代码点c.

Go相关问答推荐

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

CGO如何转换为文件*类型

租户GUID X的租户不存在self 邮箱帐户的租户(我是唯一的成员)

Makefilego version和read命令

如何在gofiber/websocket/v2中设置状态代码和原因

显示GUI时后台处理功能

从文件读取字节,将其保存到 struct 体并修改值

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

无效操作:v > max(类型参数 T 与 > 不可比较)

使用Dockertest进行Golang SQL单元测试的基本设置

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

Golang 网络应用程序安全性:您是否应该判断输入是否为有效的 utf-8?

Go 中如何调用测试函数?

判断不同 go map 类型中的重复键

无限期运行 Go routine (完成后重新启动)

Go Fyne 禁用 HSplit 调整大小?

出于某种原因,Golang (Go) AES CBC 密文被填充了 16 个 0x00 字节

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

如何迭代在泛型函数中传递的片的并集?

Golang 查询扫描未将查询正确扫描到 struct 中