亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何選擇具有自定義單詞邊界的第一個字符?

如何選擇具有自定義單詞邊界的第一個字符?

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 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號