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

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

如何在不編譯每個表達式的情況下從正則表達式中提取不同的變量

如何在不編譯每個表達式的情況下從正則表達式中提取不同的變量

Go
開心每一天1111 2022-08-30 14:40:29
我有一個表示計算機對象大小的結構。此結構的對象是根據用戶輸入的字符串值構造的;例如,“50KB”將被標記化為int值“50”和字符串值“KB”。type SizeUnit stringconst (    B  = "B"    KB = "KB"    MB = "MB"    GB = "GB"    TB = "TB")type ObjectSize struct {    NumberOfUnits int    Unit          SizeUnit}func NewObjectSizeFromString(input_str string) (*ObjectSize, error)在這個函數的主體中,我首先檢查輸入值是否為有效格式;即任意位數,后跟“B”、“KB”、“MB”、“GB”或“TB”中的任何一位。然后,我分別提取 int 和字符串組件,并返回指向結構的指針。為了做這三件事,我不得不編譯正則表達式三次。第一次檢查輸入字符串的格式rg, err := regexp.Compile(`^[0-9]+B$|KB$|MB$|GB$|TB$`)然后再次編譯以獲取int組件:rg, err := regexp.Compile(`^[0-9]+`)rg.FindString(input_str)然后再次編譯以獲取字符串/單位組件:rg, err := regexp.Compile(`B$|KB$|MB$|GB$|TB$`)rg.FindString(input_str)有沒有辦法通過單個正則表達式編譯從輸入字符串中獲取兩個組件?完整的代碼可以在Go Playground上找到。我應該指出,這是一個學術問題,因為我正在試驗Go的正則表達式庫。對于這種類型的簡單用例,我可能會使用一個簡單的for循環來解析輸入字符串。
查看完整描述

1 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

您可以使用正則表達式使用單個表達式捕獲這兩個值。FindStringSubmatch:


func NewObjectSizeFromString(input_str string) (*ObjectSize, error) {

    var defaultReturn *ObjectSize = nil

    full_search_pattern := `^([0-9]+)([KMGT]?B)$`


    rg, err := regexp.Compile(full_search_pattern)

    if err != nil {

        return defaultReturn, errors.New("Could not compile search expression")

    }

    matched := rg.FindStringSubmatch(input_str)

    if matched ==  nil {

        return defaultReturn, errors.New("Not in valid format")

    }

    i, err := strconv.ParseInt(matched[1], 10, 32)

    return &ObjectSize{int(i), SizeUnit(matched[2])}, nil

}

可以看到游樂場。

正則表達式匹配^([0-9]+)([KMGT]?B)$

  • ^- 字符串的開頭

  • ([0-9]+)- 組 1(此值將保存在):一個或多個數字matched[1]

  • ([KMGT]?B)- 組 2 (它將在): 一個可選的 , , , 字母, 然后是一個字母matched[2]KMGTB

  • $- 字符串末尾。

請注意,這將保持整個比賽。matched[0]


查看完整回答
反對 回復 2022-08-30
  • 1 回答
  • 0 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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