This question already has answers here:
How to extract a floating number from a string [duplicate]

(7个答案)


2个月前关闭。




我在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
但这不是我所期望的。

最佳答案

似乎您只对景点的纬度和经度感兴趣,而对正则表达式却没有兴趣。
也许您只是使用像这样的东西:

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

关于regex - 如何提取子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63123873/

10-15 21:58