为了账号安全,请及时绑定邮箱和手机立即绑定

如何选择具有自定义单词边界的第一个字符?

如何选择具有自定义单词边界的第一个字符?

Go
PIPIONE 2023-07-31 15:22:04
我用一系列这样的单词进行了测试用例:    {        input:    "Halley's Comet",        expected: "HC",    },    {        input:    "First In, First Out",        expected: "FIFO",    },    {        input:    "The Road _Not_ Taken",        expected: "TRNT",    },我希望用一个正则表达式来匹配这些单词的所有第一个字母,避免 char: "_" 作为第一个字母匹配,并计算单词中的单引号。目前,我有这个正则表达式适用于 pcre 语法,但不适用于 Go regexp 包:(?<![a-zA-Z0-9'])([a-zA-Z0-9'])我知道 Go 不支持环视,但我正在寻找一种好方法来做到这一点。我还使用这个函数来获取所有字符串的数组:re.FindAllString(s, -1)谢谢你的帮助。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

处理字符类和单词边界的东西应该足够了:


\b_*([a-z])[a-z]*(?:'s)?_*\b\W*

演示


用法:


package main


import (

    "fmt"

    "regexp"

)


func main() {

    re := regexp.MustCompile(`(?i)\b_*([a-z])[a-z]*(?:'s)?_*\b\W*`)

    fmt.Println(re.ReplaceAllString("O'Brian's dog", "$1"))


}


查看完整回答
反对 回复 2023-07-31
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

ftr,少正则表达式的解决方案


package main


import (

    "fmt"

)


func main() {

    inputs := []string{"Hallمرحباey's Comet", "First In, First Out", "The Road _Not_ Taken", "O'Brian's Dog"}

    c := [][]string{}

    w := [][]string{}

    for _, input := range inputs {

        c = append(c, firstLet(input))

        w = append(w, words(input))

    }

    fmt.Printf("%#v\n", w)

    fmt.Printf("%#v\n", c)

}


func firstLet(in string) (out []string) {

    var inword bool

    for _, r := range in {

        if !inword {

            if isChar(r) {

                inword = true

                out = append(out, string(r))

            }

        } else if r == ' ' {

            inword = false

        }

    }

    return out

}


func words(in string) (out []string) {

    var inword bool

    var w []rune

    for _, r := range in {

        if !inword {

            if isChar(r) {

                w = append(w, r)

                inword = true

            }

        } else if r == ' ' {

            if len(w) > 0 {

                out = append(out, string(w))

                w = w[:0]

            }

            inword = false

        } else if r != '_' {

            w = append(w, r)

        }

    }

    if len(w) > 0 {

        out = append(out, string(w))

    }

    return out

}


func isChar(r rune) bool {

    return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')

}

输出


[][]string{[]string{"Hallمرحباey's", "Comet"}, []string{"First", "In,", "First", "Out"}, []string{"The", "Road", "Not", "Taken"}, []string{"O'Brian's", "Dog"}}

[][]string{[]string{"H", "C"}, []string{"F", "I", "F", "O"}, []string{"T", "R", "N", "T"}, []string{"O", "D"}}



查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信