2018-05-10 04:05
浏览 348


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...

图片转代码服务由CSDN问答提供 功能建议


字符串应为: hostkafka1.kafka.server:type = BrokerTopicMetrics,name = FailedProduceRequestsPerSec,topic = auto.tooling.files.received.v1.MeanR ^成本”, “metric_path”: “dsdpecard01kfk06.kafka.server:类型= BrokerTopicMetrics,名称= FailedProduceRequestsPerSec,话题=信用card.servicing.accounts.authorized-user.created.v1.MeanRate”, “类型”:空, “ region”:“ us-east-1

,我想匹配 hostkafka1

I 可以在其他语言中使用 /.+?(?= \。)/ ,但不能使其在golang中工作...

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dsfphczao23473056 2018-05-10 04:12

    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:

    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:

    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 \.
    解决 无用
    打赏 举报
  • duanbai1370 2018-05-10 11:51

    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 {
    } else {
        // no match


    解决 无用
    打赏 举报

相关推荐 更多相似问题