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

时间:2020-08-17 15:06:08

标签: regex go

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

"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。

1 个答案:

答案 0 :(得分:2)

就像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
}