doudeng5218
2018-03-21 13:07
浏览 313
已采纳

golang regexp FindStringSubmatch()没有返回正确的最后一组

I am using go1.10 darwin/amd64, here is the code:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    raw := "012 abc 012"
    r := regexp.MustCompile(`(\d+).*(\d+)`)
    m := r.FindStringSubmatch(raw)
    fmt.Printf("len(m)=%v
%v
%v
%v
", len(m), m[0], m[1], m[2])
}

Output is:

len(m)=3

012 abc 012

012

2

You can also run it here: https://play.golang.org/p/i2zlhClB72e

I expect that the output of m[2] is "012" but not "2".

Can anyone let me know where the issue is? Thanks very much.

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

我正在使用go1.10 darwin / amd64,这是代码: < pre> package main import( “ fmt” “ regexp” ) func main(){ raw:=“ 012 abc 012” r:= regexp.MustCompile (`(\ d +)。*(\ d +)`) m:= r.FindStringSubmatch(raw) fmt.Printf(“ len(m)=%v %v %v %v “,len(m),m [0],m [1],m [2]) }

输出为:

len(m)= 3

012 abc 012

012 \ n

2

您也可以在此处运行它: https://play.golang.org/p/i2zlhClB72e

我希望m [2]的输出为“ 012”,但是 不是“ 2”。

有人可以让我知道问题出在哪里吗? 非常感谢。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • droi5225 2018-03-21 13:13
    已采纳

    Regular expressions are greedy, so .* will match 01 leaving just 2 to match the final \d+.

    You probably want to change your expression to something like the following: (\d+)[^\d]*(\d+)$ to match a sequence of digits (captured), anything but a sequence of digits, a sequence of digits (captured), and the end of line.

    The same code for the rest will print what you expected:

    len(m)=3
    012 abc 012
    012
    012
    
    点赞 打赏 评论

相关推荐 更多相似问题