Можно ли извлечь подстроку из строки (сложной строки) в golang? - PullRequest
0 голосов
/ 17 апреля 2019

Я столкнулся с проблемой использования регулярных выражений, необходимо решить два вопроса: от простого к сложному.Во-первых, это использование регулярного выражения для сопоставления строки, после чего оно должно извлечь некоторые подстроки из сообщения.

, как у меня есть строка, которая

"В текущей комнате чата: что делатьВы едите на сегодня? (Это сообщение отредактировал Шарон, сообщение отправлено Леоном в 2018-11-10 21:00:00) "

" В текущем чате: Эй, приятель, тебе нравится?golang? (Это сообщение отредактировал Leon, сообщение отправлено в 2018-01-10 10:00:59 от Mike) "

В приведенном выше сообщении некоторая часть не изменится как" В текущем чатеroom: "and" Это сообщение отредактировано ..., сообщение отправлено ... из ... "

Когда я встречал такого рода сообщения, это считается" Уведомлением об изменении ". Iнужно отфильтровать все сообщения, которые компилируются со структурой.

То, что я пишу, это

var testRgx = regexp.MustCompile(`^In current chatting room: .* \(This message is edited by .*, the message is sent on .* from .*\)$`)

Я знаю, что это немного глупо, но по крайней мере может работать

и когда я запускаю его, результат показывает, что это правда.

sample := "In current chatting room: what do you eat for today? I input some shit (sdfhjskdfjksljhfdsjkdf) can you detect this? (This message is edited by Sharon, the message is sent on 2018-11-10 21:00:00 from Leon)"
fmt.Println(testRgx.MatchString(sample ))

До сих пор я думаю, что это fine

Второй шаг - получение содержимого, редактора, времени и оригинального отправителя.

Что я сделал, я заменил первую часть, которая называется «В текущей комнате чата», а затем строка изменилась на

changedString := "what do you eat for today? I input some shit (sdfhjskdfjksljhfdsjkdf) can you detect this? (This message is edited by Sharon, the message is sent on 2018-11-10 21:00:00 from Leon)"

И с конца строки я вырезалСтрока после последнего из, так что я могу получить "Леон".

//after cut after from
cutString := "what do you eat for today? I input some shit (sdfhjskdfjksljhfdsjkdf) can you detect this? (This message is edited by Sharon, the message is sent on 2018-11-10 21:00:00 "

Затем обрезать строку после последнего, чтобы получить время.

//after cut after on
cutString := "what do you eat for today? I input some shit (sdfhjskdfjksljhfdsjkdf) can you detect this? (This message is edited by Sharon, the message is sent "

Затем последнийшаг состоит в том, чтобы извлечь редактор.

Я думаю, что этот метод довольно глуп, я искал какой-то пример, как извлечение компонента, используя regexp Golang: извлечение данных с помощью Regex

но это немного сложный случай, я думаю, что метод для извлечения написанного мной компонента довольно уродлив.

Могу ли я спросить, есть ли способ напрямую использовать регулярное выражение для извлечения компонентов?

Для уведомительного сообщения

«В текущей комнате чата:» не изменится, изменится компонент отредактированного сообщения, а содержимое в скобках изменит только редактор (Шарон), время (2018-11-10 21:00:00)и отправитель (Леон), другая часть в скобках не изменится, как

(Это сообщение отредактировано ххххх, сообщение отправлено в хххх от хххх)

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Позвольте мне попытаться понять вашу проблему. В заданной входной строке вы хотите найти имя редактора и отправителя, а также вы хотите извлечь дату и время.

Для начала, у вас может быть два регулярных выражения, одно для совпадающих имен и еще одно для даты и времени. Вы можете сделать что-то вроде этого

namesRegex, _ := regexp.Compile("by\\s(.*?),(.*?)\\s*from\\s*(.*?)\\)")
dateTimeRegex, _ := regexp.Compile("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})")
input := "In current chatting room: what do you eat for today? (This message is edited by Sharon, the message is sent on 2018-11-10 21:00:00 from Leon)"
if namesRegex.MatchString(input) {
    res := namesRegex.FindStringSubmatch(input)
    fmt.Println("Edited by = ", strings.TrimSpace(res[1]))
    fmt.Println("From = ", strings.TrimSpace(res[3]))
}
if dateTimeRegex.MatchString(input) {
    res := dateTimeRegex.FindAllString(input, 1)
    fmt.Println(res[0])
}

Вывод :

Под редакцией = Шарон

От = Леон

2018-11-10 21: 00: 00

0 голосов
/ 17 апреля 2019

Я не мог оставить комментарий, поэтому мне пришлось поместить это здесь ... Вы исследовали группы захвата регулярных выражений?

например Как получить функциональность захвата группы в регулярных выражениях Golang?

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