登录
首页 >  Golang >  Go问答

匹配空字符串或模式的正则表达式

来源:stackoverflow

时间:2024-03-25 19:24:31 283浏览 收藏

为提取包含空字符串在内的逗号分隔字符串,正则表达式并非最佳工具。使用 csv 库可以更有效地从字符串中提取数据,如以下代码所示: ```go import ( "bytes" "encoding/csv" "fmt" ) func main() { testdata := `1/17/09 1:23,"Soap, Shampoo and cleaner",,1200,Amex,Steven O' Campbell,,Kuwait,1/16/09 14:26,1/18/09 9:08,29.2891667,,48.05` reader := csv.NewReader(bytes.NewBufferString(testdata)) content, err := reader.Read() if err != nil { panic(err) } fmt.Println(len(content)) // 13 } ```

问题内容

我正在尝试构建一个应用程序,该应用程序从网络读取 csv 文本行并将其插入到 sqlite 数据库中。我需要提取出现在逗号之间的所有字符串,包括空字符串。 例如,我需要解析的一行文本如下所示:

"1/17/09 1:23,\"soap, shampoo and cleaner\",,1200,amex,steven o' campbell,,kuwait,1/16/09 14:26,1/18/09 9:08,29.2891667,,48.05"

我的代码片段如下,我想我需要使用正则表达式,因为我试图在“,”字符处分割字符串行,但逗号也可能显示为字符串的一部分。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`^|[^,"']+|"([^"]*)"|'([^']*)`)
    txt := "1/17/09 1:23,\"Soap, Shampoo and cleaner\",,1200,Amex,Steven O' Campbell,,Kuwait,1/16/09 14:26,1/18/09 9:08,29.2891667,,48.05"

    arr := re.FindAllString(txt, -1) 
    arr2 := strings.Split(txt, ",")     
    fmt.Println("Array lengths: ", len(arr), len(arr2)) 
  
}

本例中分割数组的正确长度应为 13。


解决方案


就像 MarcFlimzy 所说,正则表达式在这里不是正确的工具。由于您没有指定我们应该使用正则表达式作为从字符串中提取数据的工具,因此这里有一个关于如何从字符串中提取这些数据并适合您正在寻找的结果的代码片段:

import (
    "bytes"
    "encoding/csv"
    "fmt"
)

func main() {
    var testdata = `1/17/09 1:23,"Soap, Shampoo and cleaner",,1200,Amex,Steven O' Campbell,,Kuwait,1/16/09 14:26,1/18/09 9:08,29.2891667,,48.05`
    var reader = csv.NewReader(bytes.NewBufferString(testdata))
    var content, err = reader.Read()
    if err != nil {
        panic(err)
    }
    fmt.Println(len(content)) // 13
}

以上就是《匹配空字符串或模式的正则表达式》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>