Получить подстроки указанного формата c - PullRequest
0 голосов
/ 06 августа 2020

У меня есть строка в этом формате:

2002:4 2003:"\x02\x00\x04\x01" 2004:"\x00\x06\x03" 2005:1 2006:"YYYY-MM-DD" 3000:"Date time" 3001:"01/01/1900" 3002:"07/20/2020"

Меня интересуют только значения 3000:"Date time", 3001: "01/01/1900", 3002:"07/20/2020" - те, которые выше 3000. Сначала я попытался разделить строку на пробелы для другого примера. Но здесь «Дата и время» тоже имеет место. Так что мой лог c ломается в этом случае. Я новичок в Golang, поэтому хочу знать, как лучше всего сделать это в Go? Могу я попробовать использовать Regex, или это плохая идея?

Ответы [ 2 ]

1 голос
/ 30 августа 2020

Если строка в кавычках после 3000: никогда не содержит других символов двойных кавычек ", вы можете использовать следующее регулярное выражение:

30\d+:".*?"

Более полный Go фрагмент (адаптируйте в соответствии с вашими потребностями):

package main

import (
    "fmt"
    "regexp"
)

const s = `2002:4 2003:"\x02\x00\x04\x01" 2004:"\x00\x06\x03" 2005:1 2006:"YYYY-MM-DD" 3000:"Date time" 3001:"01/01/1900" 3002:"07/20/2020"
`

func main() {

    re, err := regexp.Compile(`30\d+:".*?"`)
    if err != nil {
        panic(err)
    }
    matches := re.FindAllString(s, -1)
    fmt.Println(matches) // [3000:"Date time" 3001:"01/01/1900" 3002:"07/20/2020"]
}
1 голос
/ 07 августа 2020

Я имею в виду, что вы могли бы написать супер простой парсер:

https://play.golang.org/p/q0oeNlhSKJT

func parse(s string) {
    tokens := make(map[string]string)
    key := []byte{}
    value := []byte{}
    inQuote := false
    inKey := true
    for  i := 0; i < len(s); i++ {
        ch := s[i]
        // If we see a :, we're switching from key to value (or vice versa)
        // unless we're inside of a quote
        if ch == ':' && !inQuote {
            inKey = !inKey
        // if we see a ", we're switching from in a quote to out or out to in
        } else if ch == '"' {
            inQuote = !inQuote
        // if we see a space, and we're not in a quote, we've completed a key value pair
        } else if ch == ' ' && !inQuote {
            inKey = !inKey
            if inKey {
                tokens[string(key)] = string(value)
                key = []byte{}
                value = []byte{}
            }
        // otherwise, add this character to either they key or the value
        } else if inKey {
            key = append(key, ch)
        } else {
            value = append(value, ch)
        }
    }
    // add the final key value pair
    tokens[string(key)] = string(value)
    // print out the ones with keys >= 3000
    for k, v := range tokens {
        n, _ := strconv.Atoi(k)
        if (n >= 3000) {
            fmt.Println("K: " + k + " | V: " + v)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...