golang正则表达式将所有内容匹配为“。”。

I'm trying to do some regex in go match everything up to the first ..

The string would be this: 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

and I want to match hostkafka1

I can use /.+?(?=\.)/ in other languages but can't get it to work in golang...

You can match everything from the start of the string that is not a period . with the following:

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

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

This works because:

  • the first ^ indicates the beginning of the string
  • the [^.] indicates matching a character that is not a period
  • the + is the repetition operator to indicate more than one

This will automatically end the match when a . is encountered.

If you want to ensure a period exists you can do the following:

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

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

This works a bit differently than above in that it needs to match a period and captures everything before it.

  • the \. at the end requires matching a period
  • the () capture group allows exclude the matching period in the result
  • the . in the parens indicates any character
  • the +? indicates a lazy repetition to stop as soon as the condition is met, here matching a literal period \.

There is really no reason to bust out the regex engine for such a trivial task. You are not dealing with a regular language. As evidenced by your question it is much clearer to write (and will run faster):

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

Playground: https://play.golang.org/p/fVmbERaz2SN