我使用regexp.Compile(`^ 123(?:4)`)尝试从“1234abcd”获得“123”,而它是“1234”

时间:2017-07-27 06:01:52

标签: regex go

我正在使用go 1.8.3进行编码,我想使用regexp包从"123"获取"1234abcd"。当我使用regexp.Compile("^123(?:4)")时,它来到了"1234"

编码:https://play.golang.org/p/jB7FmxWz9r

package main

import (
    "regexp"
    "fmt"
)

func main() {
    test, err := regexp.Compile(`^123(?:4)`)
    if err != nil {
        fmt.Println(err)
        return
    }
    input := "1234|wserw"
    fmt.Println(test.FindString(input))
}

出来了:1234

预期:123

1 个答案:

答案 0 :(得分:2)

根据https://groups.google.com/forum/#!topic/golang-nuts/8Xmvar_ptcU

  

捕获组是一个(),它记录在索引的匹配列表中,其他语言可能称为$ 1,$ 2,$ 3等等。非捕获组是一种使用()而不取其中一个数字的方法。组是否正在捕获对整个表达式匹配的完整字符串没有影响。这里匹配的完整字符串是" datid = 12345",这就是FindString返回的内容。

     

您使用非捕获组的原因与在算术表达式(x + y)* z中使用括号相同:覆盖默认运算符优先级。无论是否有群组,优先权都是相同的。

     

换句话说,(?:datid =)[0-9] {5}与datid = [0-9] {5}完全相同的正则表达式。

因此golang的开发人员会采取行为。

变通方法正在使用regexp.Compile(`^(123)(?:4)`),并使用FindStringSubmatch

捕获它