猿问

如何提取子字符串

我在 Go 中编写了以下代码来提取字符串内部的两个值。


我使用了两个正则表达式来查找数字(float64)。


第一个结果是正确的,只有数字。但第二个是错误的。


这是代码:


package main


import (

    "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

但这不是我所期待的。


狐的传说
浏览 118回答 2
2回答

临摹微笑

似乎您只对景点的纬度和经度感兴趣,而不是真正对正则表达式感兴趣。也许你只是使用这样的东西:package mainimport (    "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

GCT1015

你几乎在那里。尝试(?m)(?:3d|4d)-([\d\.-]+)(?:!|$)https://regex101.com/r/8KgirB/1您所需要的只是零件周围的匹配组[\d\.-]+。使用此组,您可以直接访问它package mainimport (    "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])    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答