ключ регулярного выражения golang: значение вопроса - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь разбить сообщение системного журнала на ключ: значение 'map [string] string', но, похоже, не могу получить правильное регулярное выражение.

Исходная строка разграничивает свои ключи и значения знаком '='. Тем не менее, каждая пара разделена пробелами с пробелами, которые фактически находятся в пределах значений. У меня это довольно близко, но, как вы можете видеть из ссылки ниже, я не могу получить остальные значения 'start', 'end' или 'suser'.

Вот ссылка на игровую площадку Голанга, показывающая мою точную проблему:

package main

import (
    "fmt"
    "regexp"
)

var rex = regexp.MustCompile("(\\w+)=(.+?[^\\\\s\\\\w+=]+)")

func main() {
    conn := "start=Mar 26 2019 10:36:14 +00:00 end=Mar 26 2019 10:36:14 +00:00 suser=AD.COM\\\\Username src=10.1.0.51"
    data := rex.FindAllStringSubmatch(conn, -1)

    res := make(map[string]string)
    for _, kv := range data {
        k := kv[1]
        v := kv[2]
        res[k] = v
    }
    for v := range res {fmt.Printf("%s: %v\n", v, res[v])}

}

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Вы можете использовать

 var rex = regexp.MustCompile(`(\w+)=([^=]*\w)(?:\s|$)`)

См. Демонстрационную версию Go , демонстрационную версию regex онлайн и график Regulex .

enter image description here

Сведения о регулярном выражении

  • (\w+) - Группа захвата 1: одно или несколько символов слова
  • = - = char
  • ([^=]*\w) - Группа захвата 2: любые 0+ символов, кроме =, а затем слово char
  • (?:\s|$)- либо пробел, либо конец строки.
1 голос
/ 02 апреля 2019

Возможно, попробуйте следующий шаблон:

(\\s*[^\\s]+)=([^=]*[\\w\\d]+\\s|[\\d.]+)

Результат

start: Mar 26 2019 10:36:14 +00:00 
end: Mar 26 2019 10:36:14 +00:00 
suser: AD.COM\\Username 
src: 10.1.0.51

Пример :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...