为了账号安全,请及时绑定邮箱和手机立即绑定

如何提取子字符串

如何提取子字符串

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 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号