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

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

拆分字符串時,如何在輸出中包含運算符?

拆分字符串時,如何在輸出中包含運算符?

Go
慕沐林林 2021-10-11 13:26:46
昨天我問了這個關于在 python 中拆分字符串的問題。從那以后,我決定用 Go 來做這個項目。我有以下幾點:input := "house-width + 3 - y ^ (5 * house length)"s := regexp.MustCompile(" ([+-/*^]) ").Split(input, -1)log.Println(s)  //  [house-width 3 y (5 house length)]如何在此輸出中包含運算符?例如,我想要以下輸出:['house-width', '+', '3', '-', 'y', '^', '(5', '*', 'house length)']編輯:為了澄清我正在拆分以空格分隔的運算符,而不僅僅是運算符。運算符的兩端必須有一個空格,以將其與破折號/連字符區分開來。如果需要,請參閱我鏈接到的原始 python 問題以進行澄清。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

您可以使用regexp.Split()(就像您所做的那樣)獲取表達式的操作數,并且可以使用regexp.FindAllString().


通過這樣做,您將擁有 2 個單獨的[]string切片,如果您希望將結果合并為一個切片,則可以合并這 2 個[]string切片。


input := "house-width + 3 - y ^ (5 * house length)"


r := regexp.MustCompile(`\s([+\-/*^])\s`)


s1 := r.Split(input, -1)

s2 := r.FindAllString(input, -1)


fmt.Printf("%q\n", s1)

fmt.Printf("%q\n", s2)


all := make([]string, len(s1)+len(s2))

for i := range s1 {

    all[i*2] = s1[i]

    if i < len(s2) {

        all[i*2+1] = s2[i]

    }

}

fmt.Printf("%q\n", all)

輸出(在Go Playground上試試):


["house-width" "3" "y" "(5" "house length)"]

[" + " " - " " ^ " " * "]

["house-width" " + " "3" " - " "y" " ^ " "(5" " * " "house length)"]

筆記:


如果要修剪運算符中的空格,可以使用該strings.TrimSpace()函數:


for i, v := range s2 {

    all[i*2+1] = strings.TrimSpace(v)

}

fmt.Printf("%q\n", all)

輸出:


["house-width" "+" "3" "-" "y" "^" "(5" "*" "house length)"]


查看完整回答
反對 回復 2021-10-11
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

如果您打算在之后解析表達式,則必須進行一些更改:


包括括號作為詞素

你不能讓空格和破折號都是有效的標識符字符,因為例如在兩者- y之間3并且^將是一個有效的標識符。

完成后,您可以使用簡單的線性迭代來對字符串進行詞法分析:


package main


import (

    "bytes"

    "fmt"

)


func main() {


    input := `house width + 3 - y ^ (5 * house length)`

    buffr := bytes.NewBuffer(nil)

    outpt := make([]string, 0)


    for _, r := range input {

        if r == '+' || r == '-' || r == '*' || r == '/' || r == '^' || r == '(' || r == ')' || (r >= '0' && r <= '9') {

            bs := bytes.TrimSpace(buffr.Bytes())

            if len(bs) > 0 {

                outpt = append(outpt, (string)(bs))

            }

            outpt = append(outpt, (string)(r))

            buffr.Reset()

        } else {

            buffr.WriteRune(r)

        }

    }


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


}

詞法分析后,使用 Dijkstra 的分流碼算法構建 AST 或直接評估表達式。


查看完整回答
反對 回復 2021-10-11
  • 3 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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