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

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

如何提取子字符串

如何提取子字符串

Go
狐的傳說 2022-06-21 10:24:31
我在 Go 中編寫了以下代碼來提取字符串內部的兩個值。我使用了兩個正則表達式來查找數字(float64)。第一個結果是正確的,只有數字。但第二個是錯誤的。這是代碼:package mainimport (    "fmt"    "regexp")func main() {    // RegExp utiliza la sintaxis RE2    pat1 := regexp.MustCompile(`[^m2!3d][\d\.-]+`)    s1 := pat1.FindString(`Torre+Eiffel!8m2!3d-48.8583701!4d-2.2944813!3m4!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d-48.8583701!4d-2.2944813`)    pat2 := regexp.MustCompile(`[^!4d][\d\.-]+`)    s2 := pat2.FindString(`Torre+Eiffel!8m2!3d-48.8583701!4d-2.2944813!3m4!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d-48.8583701!4d-2.2944813`)    fmt.Println(s1) // Print -> -48.8583701     fmt.Println(s2) // Print -> m2  (The correct answer is "-2.2944813")}這里我修改語法pat2 := regexp.MustCompile( !4d[\d\.-]+)我得到以下答案:    !4d-2.2944813但這不是我所期待的。
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

似乎您只對景點的緯度和經度感興趣,而不是真正對正則表達式感興趣。


也許你只是使用這樣的東西:


package main


import (

    "fmt"

    "strconv"

    "strings"

)


var replacer = strings.NewReplacer("3d-", "", "4d-", "")


func main() {

    var str = `Torre+Eiffel!8m2!3d-48.8583701!4d-2.2944813!3m4!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d-48.8583701!4d-2.2944813`

    fmt.Println(getLatLong(str))

}


func getLatLong(str string) (float64, float64, error) {

    parts := strings.Split(str, "!")

    if latFloat, err := strconv.ParseFloat(replacer.Replace(parts[2]), 64); err != nil {

        return 0, 0, err

    } else if lngFloat, err := strconv.ParseFloat(replacer.Replace(parts[3]), 64); err != nil {

        return 0, 0, err

    } else {

        return latFloat, lngFloat, nil

    }

}

https://play.golang.org/p/UOIwGbl6nrb


查看完整回答
反對 回復 2022-06-21
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

你幾乎在那里。嘗試(?m)(?:3d|4d)-([\d\.-]+)(?:!|$)


https://regex101.com/r/8KgirB/1


您所需要的只是零件周圍的匹配組[\d\.-]+。使用此組,您可以直接訪問它


package main


import (

    "fmt"

    "regexp"

)


func main() {

    var re = regexp.MustCompile(`(?m)(?:3d|4d)-([\d\.-]+)!`)

    var str = `Torre+Eiffel!8m2!3d-48.8583701!4d-2.2944813!3m4!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d-48.8583701!4d-2.2944813`


    for _, match := range re.FindAllStringSubmatch(str, -1) {

        fmt.Println(match[1])

    }

}


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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