我正在努力做一些正则表达式,以匹配第一个.
的所有内容。
字符串是这样的:
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
我可以在其他语言中使用/.+?(?=\.)/
,但无法在golang中使用它...
答案 0 :(得分:4)
没有理由为这样一个微不足道的任务淘汰正则表达式引擎。你不是在处理常规语言。正如您的问题所证明的那样,写起来会更加清晰(并且会更快地运行):
if n := strings.IndexByte(s, '.'); n >= 0 {
fmt.Println(s[:n])
} else {
// no match
}
答案 1 :(得分:3)
您可以将非字段.
的字符串开头的所有内容与以下内容进行匹配:
m := regexp.MustCompile(`^[^.]+`).FindString(s)
游乐场链接:https://play.golang.org/p/OlPxIcrpmWx
这是因为:
^
表示字符串的开头[^.]
表示匹配不是句号的字符+
是指示多个当遇到.
时,这将自动结束匹配。
如果您想确保存在句号,可以执行以下操作:
m := regexp.MustCompile(`^(.+?)\.`).FindStringSubmatch(s)[1]
游乐场链接:https://play.golang.org/p/oK0OvJzR2Ky
这与上面的工作方式略有不同,因为它需要匹配一个句点并捕获它之前的所有内容。
\.
需要匹配句号()
捕获组允许排除结果中的匹配期.
表示任何字符+?
表示一旦条件满足就会停止重复,此处匹配文字句点\.