golang regex将所有内容都匹配为“。”

时间:2018-05-10 04:05:24

标签: regex 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

我可以在其他语言中使用/.+?(?=\.)/,但无法在golang中使用它...

2 个答案:

答案 0 :(得分:4)

没有理由为这样一个微不足道的任务淘汰正则表达式引擎。你不是在处理常规语言。正如您的问题所证明的那样,写起来会更加清晰(并且会更快地运行):

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

游乐场:https://play.golang.org/p/fVmbERaz2SN

答案 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

这与上面的工作方式略有不同,因为它需要匹配一个句点并捕获它之前的所有内容。

  • 最后\.需要匹配句号
  • ()捕获组允许排除结果中的匹配期
  • parens中的.表示任何字符
  • +?表示一旦条件满足就会停止重复,此处匹配文字句点\.