dongzeao5047
2018-05-10 04:05
浏览 348
已采纳

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

图片转代码服务由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: 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 \.
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 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 {
        fmt.Println(s[:n])
    } else {
        // no match
    }
    

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题