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:
^
indicates the beginning of the string[^.]
indicates matching a character that is not a period+
is the repetition operator to indicate more than oneThis 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.
\.
at the end requires matching a period()
capture group allows exclude the matching period in the result.
in the parens indicates any character+?
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