golang regex соответствует всему, вплоть до "." - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь сделать какое-нибудь регулярное выражение в go, сопоставить все до первого ..

Строка будет такой: hostkafka1.kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=auto.tooling.files.received.v1.MeanR^Cost","metric_path":"dsdpecard01kfk06.kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=credit-card.servicing.accounts.authorized-user.created.v1.MeanRate","type":null,"region":"us-east-1

и я хочу соответствовать hostkafka1

Я могу использовать /.+?(?=\.)/ на других языках, но не могу заставить его работать на Голанге ...

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

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

if n := strings.IndexByte(s, '.'); n >= 0 {
    fmt.Println(s[:n])
} else {
    // no match
}

Детская площадка: https://play.golang.org/p/fVmbERaz2SN

0 голосов
/ 10 мая 2018

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

m := regexp.MustCompile(`^[^.]+`).FindString(s)

Playground Link: https://play.golang.org/p/OlPxIcrpmWx

Это работает, потому что:

  • первый ^ указывает начало строки
  • [^.] указывает на совпадение символа, который не является точкой
  • + является оператором повторения для указания более чем одного

Это автоматически завершит матч при обнаружении ..

Если вы хотите убедиться, что период существует, вы можете сделать следующее:

m := regexp.MustCompile(`^(.+?)\.`).FindStringSubmatch(s)[1]

Playground Link: https://play.golang.org/p/oK0OvJzR2Ky

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

  • \. в конце требует совпадения периода
  • группа захвата () позволяет исключить совпадающий период в результате
  • . в скобках обозначает любой символ
  • +? указывает на ленивое повторение для остановки, как только условие выполнено, здесь соответствует буквальному периоду \.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...